From 1d458ca9f69d15f8449aea038227827d3e0be396 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 24 Nov 2025 14:25:02 +0300 Subject: [PATCH] =?UTF-8?q?ilk=20i=C5=9Flem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 100 +++ deltilda.sh | 1 + document/Abrulor Kullanim Kilavuzu_V001.pdf | Bin 0 -> 32081 bytes document/Abrulor Teknik Dokuman V001.pdf | Bin 0 -> 33012 bytes document/Abrulor_Teknik_Dokuman_V002.pdf | 118 +++ document/GPIO_mapping_from_config.csv | 51 ++ document/abrulor_pinout_annotated.png | Bin 0 -> 648744 bytes ebina_log.sql | 3 + ebuild/__init__.py | 8 + ebuild/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 391 bytes .../__pycache__/config_runtime.cpython-39.pyc | Bin 0 -> 2866 bytes .../__pycache__/config_statics.cpython-39.pyc | Bin 0 -> 2674 bytes .../config_variables.cpython-39.pyc | Bin 0 -> 2378 bytes ebuild/config_runtime.py | 133 ++++ ebuild/config_statics.py | 158 ++++ ebuild/core/__init__.py | 1 + .../core/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 135 bytes .../__pycache__/analog_sensors.cpython-39.pyc | Bin 0 -> 3348 bytes .../core/__pycache__/building.cpython-39.pyc | Bin 0 -> 14520 bytes .../__pycache__/environment.cpython-39.pyc | Bin 0 -> 6783 bytes ebuild/core/__pycache__/season.cpython-39.pyc | Bin 0 -> 8564 bytes .../__pycache__/sunholiday.cpython-39.pyc | Bin 0 -> 4825 bytes ebuild/core/analog_sensors.py | 123 ++++ ebuild/core/building.py | 590 +++++++++++++++ ebuild/core/building.py~ | 574 +++++++++++++++ ebuild/core/devices.py | 2 + ebuild/core/environment.py | 306 ++++++++ ebuild/core/season.py | 395 ++++++++++ ebuild/core/sunholiday.py | 191 +++++ ebuild/core/systems/__init__.py | 1 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 143 bytes .../systems/__pycache__/burner.cpython-39.pyc | Bin 0 -> 14524 bytes ebuild/core/systems/burner.py | 679 ++++++++++++++++++ ebuild/core/systems/burner.py~ | 678 +++++++++++++++++ ebuild/core/systems/firealarm.py | 2 + ebuild/core/systems/hydrophore.py | 2 + ebuild/core/systems/irrigation.py | 2 + ebuild/io/__init__.py | 1 + ebuild/io/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 133 bytes .../io/__pycache__/adc_mcp3008.cpython-39.pyc | Bin 0 -> 12510 bytes .../io/__pycache__/config_ini.cpython-39.pyc | Bin 0 -> 9666 bytes ebuild/io/__pycache__/dbtext.cpython-39.pyc | Bin 0 -> 8270 bytes ebuild/io/__pycache__/ds18b20.cpython-39.pyc | Bin 0 -> 4426 bytes .../__pycache__/legacy_syslog.cpython-39.pyc | Bin 0 -> 9421 bytes .../__pycache__/relay_driver.cpython-39.pyc | Bin 0 -> 9776 bytes ebuild/io/adc_mcp3008.py | 423 +++++++++++ ebuild/io/config_ini.py | 333 +++++++++ ebuild/io/dbtext.py | 338 +++++++++ ebuild/io/ds18b20.py | 158 ++++ ebuild/io/edm_db.py | 454 ++++++++++++ ebuild/io/legacy_syslog.py | 453 ++++++++++++ ebuild/io/relay_driver.py | 376 ++++++++++ ebuild/io/sensor_dht11.py | 141 ++++ ebuild/io/z2legacy_syslog.py | 608 ++++++++++++++++ ebuild/io/z2relay_driver.py | 388 ++++++++++ ebuild/io/z3legacy_syslog.py | 463 ++++++++++++ ebuild/io/zlegacy_syslog.py | 608 ++++++++++++++++ ebuild/io/zrelay_driver.py | 362 ++++++++++ ebuild/reloader.py | 95 +++ ebuild/runtime/__init__.py | 1 + ebuild/runtime/main.py | 24 + .../__pycache__/relay_test.cpython-39.pyc | Bin 0 -> 3481 bytes ebuild/tools/relay_test.py | 149 ++++ ebuild_building_log.sql | 3 + ebuild_burner_log.sql | 198 +++++ listtilda.sh | 1 + requirements.txt | 23 + run_burner.sh | 1 + scripts/run_ebuild_main.py | 7 + tail_burner.sh | 1 + tests/__pycache__/relay_test.cpython-39.pyc | Bin 0 -> 3474 bytes tests/test_building.py | 5 + 72 files changed, 9732 insertions(+) create mode 100644 README.md create mode 100644 deltilda.sh create mode 100644 document/Abrulor Kullanim Kilavuzu_V001.pdf create mode 100644 document/Abrulor Teknik Dokuman V001.pdf create mode 100644 document/Abrulor_Teknik_Dokuman_V002.pdf create mode 100644 document/GPIO_mapping_from_config.csv create mode 100644 document/abrulor_pinout_annotated.png create mode 100644 ebina_log.sql create mode 100644 ebuild/__init__.py create mode 100644 ebuild/__pycache__/__init__.cpython-39.pyc create mode 100644 ebuild/__pycache__/config_runtime.cpython-39.pyc create mode 100644 ebuild/__pycache__/config_statics.cpython-39.pyc create mode 100644 ebuild/__pycache__/config_variables.cpython-39.pyc create mode 100644 ebuild/config_runtime.py create mode 100644 ebuild/config_statics.py create mode 100644 ebuild/core/__init__.py create mode 100644 ebuild/core/__pycache__/__init__.cpython-39.pyc create mode 100644 ebuild/core/__pycache__/analog_sensors.cpython-39.pyc create mode 100644 ebuild/core/__pycache__/building.cpython-39.pyc create mode 100644 ebuild/core/__pycache__/environment.cpython-39.pyc create mode 100644 ebuild/core/__pycache__/season.cpython-39.pyc create mode 100644 ebuild/core/__pycache__/sunholiday.cpython-39.pyc create mode 100644 ebuild/core/analog_sensors.py create mode 100644 ebuild/core/building.py create mode 100644 ebuild/core/building.py~ create mode 100644 ebuild/core/devices.py create mode 100644 ebuild/core/environment.py create mode 100644 ebuild/core/season.py create mode 100644 ebuild/core/sunholiday.py create mode 100644 ebuild/core/systems/__init__.py create mode 100644 ebuild/core/systems/__pycache__/__init__.cpython-39.pyc create mode 100644 ebuild/core/systems/__pycache__/burner.cpython-39.pyc create mode 100644 ebuild/core/systems/burner.py create mode 100644 ebuild/core/systems/burner.py~ create mode 100644 ebuild/core/systems/firealarm.py create mode 100644 ebuild/core/systems/hydrophore.py create mode 100644 ebuild/core/systems/irrigation.py create mode 100644 ebuild/io/__init__.py create mode 100644 ebuild/io/__pycache__/__init__.cpython-39.pyc create mode 100644 ebuild/io/__pycache__/adc_mcp3008.cpython-39.pyc create mode 100644 ebuild/io/__pycache__/config_ini.cpython-39.pyc create mode 100644 ebuild/io/__pycache__/dbtext.cpython-39.pyc create mode 100644 ebuild/io/__pycache__/ds18b20.cpython-39.pyc create mode 100644 ebuild/io/__pycache__/legacy_syslog.cpython-39.pyc create mode 100644 ebuild/io/__pycache__/relay_driver.cpython-39.pyc create mode 100644 ebuild/io/adc_mcp3008.py create mode 100644 ebuild/io/config_ini.py create mode 100644 ebuild/io/dbtext.py create mode 100644 ebuild/io/ds18b20.py create mode 100644 ebuild/io/edm_db.py create mode 100644 ebuild/io/legacy_syslog.py create mode 100644 ebuild/io/relay_driver.py create mode 100644 ebuild/io/sensor_dht11.py create mode 100644 ebuild/io/z2legacy_syslog.py create mode 100644 ebuild/io/z2relay_driver.py create mode 100644 ebuild/io/z3legacy_syslog.py create mode 100644 ebuild/io/zlegacy_syslog.py create mode 100644 ebuild/io/zrelay_driver.py create mode 100644 ebuild/reloader.py create mode 100644 ebuild/runtime/__init__.py create mode 100644 ebuild/runtime/main.py create mode 100644 ebuild/tools/__pycache__/relay_test.cpython-39.pyc create mode 100644 ebuild/tools/relay_test.py create mode 100644 ebuild_building_log.sql create mode 100644 ebuild_burner_log.sql create mode 100644 listtilda.sh create mode 100644 requirements.txt create mode 100644 run_burner.sh create mode 100644 scripts/run_ebuild_main.py create mode 100644 tail_burner.sh create mode 100644 tests/__pycache__/relay_test.cpython-39.pyc create mode 100644 tests/test_building.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..181b4e0 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# ebuild + +`ebuild`, Raspberry Pi 2 üzerinde çalışacak şekilde tasarlanmış, +**bina ısıtma / soğutma / sulama ve genel otomasyon** projesinin çekirdek Python kodunu içerir. + +Proje yapısı: +------------- +```text +ebuild/ +├─ README.md +├─ requirements.txt +├─ document/ # Tasarım PDF'leri, notlar, şemalar +├─ scripts/ +│ └─ run_ebuild_main.py # Ana döngüyü çalıştırmak için yardımcı script +├─ tests/ +│ └─ test_building.py +└─ ebuild/ + ├─ __init__.py + ├─ config_statics.py # Bina topolojisi, FLAT_AREA, sensör/pin map'leri + ├─ config_variables.py # Setpoint, haritalar, çalışma modu (hot-reload) + ├─ reloader.py # Statik/dinamik config için ConfigReloader + ├─ core/ + │ ├─ building.py # Building/Flat/EDSensor iskeleti + │ ├─ environment.py # BuildingEnvironment – dış ısı/nem/yağmur/ışık + │ ├─ devices.py # Sensör/aktüatör soyutlamaları + │ └─ systems/ + │ ├─ burner.py # Brülör sistemi ve BurnerController + │ ├─ irrigation.py # Sulama sistemi + │ ├─ firealarm.py # Yangın alarm sistemi + │ └─ hydrophore.py # Hidrofor sistemi + ├─ io/ + │ ├─ legacy_syslog.py # Eski Rasp2 syslog formatı köprüsü + │ ├─ dbtext.py # Metin tabanlı log/DB iskeleti + │ ├─ relay_driver.py # GPIO röle sürücüsü + │ ├─ sensor_ds18b20.py # DS18B20 sensör sürücü iskeleti + │ ├─ sensor_dht11.py # DHT11 sensör sürücü iskeleti + │ └─ adc_mcp3008.py # MCP3008 ADC (yağmur / LDR) iskeleti + └─ runtime/ + ├─ main.py # Ana çalışma döngüsü iskeleti + └─ __init__.py +``` + +Konfigürasyon tasarımı: +----------------------- +* `config_statics.py` + - Bina topolojisi (FLAT_AREA: `serial`, `flat_no`, `room_no`, `floor`, `direction`, `size_m2`) + - Donanım pin eşlemeleri (`RELAY_GPIO`, `OUTPUT_GPIO`, `INPUT_GPIO` vb.) + - Ortak sensör ID'leri (dış ısı, dönüş hattı, kazan çıkışı vb.) + +* `config_variables.py` + - Konfor sıcaklığı, aralık ve tolerans (`BUILDING_SETPOINT_C`, `BUILDING_RANGE_C`, `BUILD_HEAT_TOLERANCE`) + - Brülör setpoint haritaları (`BURNER_FIRE_SETPOINT_MAP`) + - Saat bazlı delta-T ve tasarruf haritaları + - Zaman bazlı override listesi (`HEAT_TIME_OVERRIDES`) + - Runtime sensör/dairesel aktif/pasif durumları (`FLAT_STATUS`) + +`reloader.ConfigReloader`, bu iki dosyanın değişimini ayrı ayrı izler: +- `statics_changed=True` → bina/sistem topolojisi değişmiş (genelde restart / re-init gerekir) +- `variables_changed=True` → parametreler değişmiş (hot-reload ile devam edilebilir) + +`document/` klasörü: +-------------------- +Proje ile ilgili **tüm dokümantasyon ve tasarım çalışmaları** bu klasörde +tutulmalıdır. Örneğin: + +- Mimari ve akış diyagramları (PDF) +- Donanım bağlantı şemaları +- Test raporları +- Eski sistemden yeni ebuild'e geçiş notları + +Her yeni tasarım veya önemli revizyon için, ilgili notları PDF olarak +`document/` klasörüne koymak, ileride bakım ve geri izleme açısından +işleri kolaylaştırır. + +Raspberry Pi 2 üzerinde kurulum: +-------------------------------- +1. Python 3 ve `pip` paket yöneticisinin kurulu olduğundan emin ol. +2. Proje klasörüne geç: + ```bash + cd ebuild + ``` +3. (İsteğe bağlı) Sanal ortam oluştur: + ```bash + python3 -m venv .venv + source .venv/bin/activate + ``` +4. Gerekli Python paketlerini yükle: + ```bash + pip install -r requirements.txt + ``` +5. Test amaçlı ana döngüyü çalıştır: + ```bash + python3 scripts/run_ebuild_main.py + ``` + +Notlar: +------- +* GPIO ve sensör kütüphaneleri gerçek Raspberry Pi üzerinde test edilmelidir. +* Bu repo şu anda **iskelet** durumundadır; `core/` ve `io/` altındaki dosyalar + senin gerçek sürücü ve kontrol kodlarınla yavaş yavaş doldurulacaktır. diff --git a/deltilda.sh b/deltilda.sh new file mode 100644 index 0000000..aca5faf --- /dev/null +++ b/deltilda.sh @@ -0,0 +1 @@ +find . -type f -name '*~' -print -delete diff --git a/document/Abrulor Kullanim Kilavuzu_V001.pdf b/document/Abrulor Kullanim Kilavuzu_V001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9eed39ac6f3563b545a4ec0deda5da6debc51d07 GIT binary patch literal 32081 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 literal 0 HcmV?d00001 diff --git a/document/Abrulor_Teknik_Dokuman_V002.pdf b/document/Abrulor_Teknik_Dokuman_V002.pdf new file mode 100644 index 0000000..66c447b --- /dev/null +++ b/document/Abrulor_Teknik_Dokuman_V002.pdf @@ -0,0 +1,118 @@ +%PDF-1.4 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 4 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /ZapfDingbats /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +5 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +8 0 obj +<< +/PageMode /UseNone /Pages 10 0 R /Type /Catalog +>> +endobj +9 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20251117152250+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20251117152250+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +10 0 obj +<< +/Count 3 /Kids [ 5 0 R 6 0 R 7 0 R ] /Type /Pages +>> +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2144 +>> +stream +Gau0ED,91]&H9tYQqp_ldLbSqE(Kp-Kqg#/\O'KaUe&l[h@!QBleHfWPOn,;m)F]`?%fliN)LS6Og[*AHSo+a&?]Tg0ao4567^^Vh$elLL;1e@Q8qk^!P1Xtt;1Sr+Qf]7$ek[Sd0K7ED^]6n/"UnPuT61qNX"?ia.b!aX]m9Ut]XWk>OULC(X9uM&m%GjtBa^$Y#ncf!@C:7j/#l;dgBXV.4hXGd]jCb_/qL\^.c\]#N-]G:(TV(!Y3`#O9I1oZ?7i)qiHPZ>Ke"Bs+eHj<)pf%>/o[\TH\TQK'N>XA:NEOW(>@eKr@"*H(3JHeoSBrSeA;*n,8r#/g3'5s1Lhht$U]];kUsQaol;1;#Aumkpcm3)D>t/m,U")[&M7gHt2)dep+n+g\3f4-8o]1Gja.WbBKZ%XaCX`[I".K<4X&ZKb->.:036QcjnotiERRf?Y3,*sP^?9Z&>K/U7g;Qjuj.a$m3#G"2(KY.c^:NGoP?';h_[Gpk\]g'X+AguO"MQ=J<]Krqu]mkt6*Rg;3p"<4IHS(mRdLN(&QY2WQJ@6[W@t@!uN3fugOKRRN)]J^Xg:)egKc-OPXSUhFYXr\CeOQkR';(ehUX/oScqfMP]V0u4:Jti)aY5sh9'oo#*cRRL'N]Ym)JHRaS;Klmb.N`4@p$3I937ZZ4^E2:iN#`FX[2;11!;QhNA5K1VG>p5n*)LiQ0a4f*(tSr8^^ER%3!IuiJ8YJJbjYfJC$pKjEu#L%$-n4/mK`0i*<@2n`@8,XEfnf<#fAcE>D=p0lmqc:7O>/M4DJC0XpP%`lr>`@"7AOlXRPqn=0oUXf"U%'++^0@[b?a<)cDj6Ib+a.8">8]$;s9`i3QN84)5OBG"S;GX=-Y0K49?l[0_49^9]p=tO8BE"s?%Q9%T@OLUM#Q.bnUC"@m>'NULrGChu:km=NpR>6pGK]dTkPq-K-=oG73IW-qWWleOuPS9A&V?-j*P`aW$qdA+R-V.>!#c8$8Gh(AM;D&o=X#l`dCo**RS[*88(9b)L0HBIe>6&[Tug:p_FQRO6DgC?83;9C@6l=uChs`9hbt6.8<;2aBt^T]ljd@*,.eR4K#t(2R.C;II&QKm,>;>6EsRViMA(m?g%*:1l%^8<_Ii@:8o)-QEWO+_'cjA8ddgkFK18#JGF4d!eF6G+-dc>DHUO`kApqBcl+4S0_BmCJjU$CTpbC.nVDKQ%f,+`_;)Rn%_UO10#K&2:W%M[d*:Oh4_B'<]AWTPnJGi8Q_SDNFee1mLZ%#,tVrgnd;3f7E0Og.Mak]Ask"[;.bDJ>F"K9i;;\lK^^Q@VmXg/q9Gp0Br&Um!H)JW6Vq,56QkmJEO:9hTI:&dGSLbtIos<-88ke)dIPB12ZU(J.V(R3\3rb6\3,Vq'r(@MNJNk@0LW?nJNhA=Q=f242L9R4Sc0X$$)_*Bl0%=$W84WQi%qZ;XQD+tq4%%S?&lF=KQr;6KPETI/]1V1-2]m6>ZO`*,X=.Q9`&jP[kif=)eam4:fnb;&*endstream +endobj +12 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1911 +>> +stream +Gb!SmgMYb*&:Ml+%'VD1,'BuF0/]sEn]".YUidWg"]?0c`YIl[,uH9@'e=e4%OicfdT+_8i4Tg/&j[k"*6ubgB4qN2oPs6T0/:7U#01?d3%iF@i:q.2AsY3C*IL"h[NkYOk]`Tk@.82%1Ci9n^ZtLgG@,b]+D]9Y!e%?h>K`Ap)BH.Ra+!Xf>$fs[&"F@1&8$F=&9g43SC1*9*Etb:$a-+4eSHI!Kc2q;_6b1ms@g:Tp[_PB6MYE/&f)5=t\e\Dcg*`m)mASELFd&;Wch!fYOf0[p%qKUT3p:?D;($Q2NA:N9=\73oSQYSjSpqM#RD;1q'!MZZn3JMC_pDFDJt8lKX!(4-rZ*aqC]0rV=^(hL@aY37*o/$MQH(3:/dp+8ZDotUNej1F+oqX=9?oM7+^V165hmuhpTE,E6aKM&MF"1c3\4[6T?S)8DCE%8Rn*MAA7.6Md,2qV6/%2cOuR/:IH4"QlD1_[,nQ9R]p(=I^n,SYJ35nHR2Y8e5e+`#2LO_]njQoXn%]UB1q1r(ll4'Q;Bh!WtbFaaQo,TEGR$:L#6,Iij?=;K?S*j]I?QnaOS5Xb\IS1G6tRi0/S?\TK6DMu+GVdfO!3Yce:gk(+GERm6mNp`8fWFVhYufq\eY%u">"HiL6#5,f5%0#hg=$E21saa<'u'\0DdNK#enF")2@$l;CJo*A6G5+*1J9NJNuS?OK^1GKX>W9QE2N_caJ+;E_I)ZM`PZcH'Utr"5/u=r^A>P.PsP&KjT_`Bos=-'4M_5KcARc/pa^sllEI%:R(<[U/YkQ#II@)Q.Y!Wd[MM7Tugnjkdn4sZO\EfmWtsJI(/!41sX:aU2c_O"Br8De+0.bp]jMcXqn+=V!ApjG:o,9?kcI>H]@@i;1i0E($3`0%_kQ?N0:I$&Ocp"NKV+^g2nWq%OpocC3ak_7Eh4JR+Dp6VG(9!n_CQ,K%WpTAI`MJnY39PReC5!4-bO,9=50AFZ`eZmgn"p=$I%_8okk9_h).VKL2f_fbkdI]+8!+A,?6%r9`h'lcE@W]__-+eiqIY.5caT6)3A"KsTeO`(?'J/mcXm)Z*,0@VMKIhD-"#$s"ggC:Rt.$^KF!BLWHY:]EL[\VB,DB@1(-j:qhSY`7]!($Z<2_&i?l]r7q+FLn53M9aI=/#Eq6eKgjt.r#J.H^i-8\i'sM5MEoRi:Su5[CS,)6oBtVF%A$dI>q`u4fVeOR>u>!e>3AO,X9Jrhi[B"=Ip&ocZ<*P5O:r@c?$8a/:=2qO7;.VXScjg)R5@+Mb1)H3pq^Ec[KCN!NV6g$A">5't2(2s3?pAbU`6"]0*to"r9b2OFCcD;*7k-bt>]g9=j$8WM[B&6YQ9c$Mo%=nnrYR+gmHerc$1K5cs+,=OS.+S(l).]S_Qi@',V],[uqGW1S'PCG_OZQ,-R_CXb4Rdc?]&GtiftI8\UloZkSG,"4l#jm=KGKe2BB<0TU_'hOePd=Z1aK>.CLZL%G~>endstream +endobj +13 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1680 +>> +stream +Gb"/(95iiK&AIV:QqN"+FW=&[--*Jh;\oVC)`2P].!-=sN5LgA;G&^qrq.:0ngdkSS_Z0M6X`4lb_LuFpqC[6!!`'%h"*6*\=UOu1k6^%fb4M+rX`\NnC-a[?giSaAho)d9`!f>eX0Ca!%eMc]7_o_EjttTh.U1T)Rti2!6i04ZO;#]CAA!j1l>cfQEl#RYWu$PThuH&1eNKl<"dV5N2j29:>HB,a:Lt'#$!`ge\Xj/=/G/R_sG^o:L2_[PnoD^FLco/CH$Q"%6NL/2pleq8J_jXkABY=sP_@Qp(8c,fTF%OF$Qtt8bO9sKc@C._ZVlZ5lR.'p)gd,rXPs0u.$qAuR^)Dk6hD!EFa233>pYc=C"q/``Hq-r,0K'+'gi=5!DRnb^H*Z2cTuL80mXP,Dqs&o]N*e&@UaNV#JhRYoJ_<94+CXZ4:2XYXoqUH1RJ3Fn9MkgC(Nr:#:D,bLa5)\YREN0^K5LfE+<%_-hi1,;gK,5P?ELdsN@kZf-u4-(Chcg9F\ho*B#+pBM9/TVG)c1ZlUlOHmOdtY_s#6Ih!X,#*\GWf:j:ubfIHYIX(&!AUs#KemEbH)lVkQ*1V]^XH3;LJufYr!.*5`<6n]ed_oH!a=If:('f+FI_l'r=n-<*Aar1!5K=u.d1C4S8/i+CAE"^PmYJ6+N3t6D^'tbN,:?sh#,B)P1e]+>R6-5gd;o0W"j:+T3R$e@0"dGE$Sk#oq?DAlmE7b(h&adE)Kpd-'i$I632*\K2\Gu9LeMcE?L";E4piMVJjmeH&&Ej2GT=S`55Zt5N`'8AamYD=)kA4M5GWttHVXBeKo`-[qkWEPTliA=g#`W'76tZSYcPeOfp.Daeu.^#/1R1];LRGsPEY\H!K("t^>^./MXr5?N+-,p;@fuu7I4Sq79Y"o`iB(=]menSf^JJX5l0r_^+.ZKYB0@](Zqem8^D,r>[c3^CaVY@`*b-FBYr&Hb+8o-4JUM`Ops5%8QMRa=p4`Kj9;s;F&]:_2R8LbipmD`G(2@^InRJ:[\7m3F"JDo+0agSlVb6^:+7@:e8h.\UoLXs9#X8s=H-B>%7/XPp/6Q:C5+#-SWhpkX]FH19q)B*01`>)c[S;HjBB=V-#^=*4)D/%"sHTF>Fm1^SqaRgF'.Ym4si_Cb,WBp=oaLbgou>sJIk69]-=(%rRCDi[=P[s+qJMEZGID)L9^WL'brAc@n$\8cWVeRHCN_nA"*=oUl=9CMHP]nhX"uA>Q#61jf7"6V4Ao$<:'@oCC.0I7RA&V?%Spi.cU'476ghW3o,(etrm$3p@Vs5*jgn]TkL..%V(\ONc6[8L=rplAFm[VG\su)Gs3N\"H3Ea%1(US<=E1rf8!H\@0),ST7$Um'6Rj[HI$;8s>2'Zp:^E'Yg;lFY.XT4\^L#l>'_jQ-endstream +endobj +xref +0 14 +0000000000 65535 f +0000000073 00000 n +0000000124 00000 n +0000000231 00000 n +0000000314 00000 n +0000000391 00000 n +0000000596 00000 n +0000000801 00000 n +0000001006 00000 n +0000001075 00000 n +0000001358 00000 n +0000001430 00000 n +0000003666 00000 n +0000005669 00000 n +trailer +<< +/ID +[] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 9 0 R +/Root 8 0 R +/Size 14 +>> +startxref +7441 +%%EOF diff --git a/document/GPIO_mapping_from_config.csv b/document/GPIO_mapping_from_config.csv new file mode 100644 index 0000000..74535db --- /dev/null +++ b/document/GPIO_mapping_from_config.csv @@ -0,0 +1,51 @@ +# ------------------------------------------------- +# GPIO ÖZETİ (Raspberry Pi 40-pin Header) +# - Tüm pinler BCM numarası ile konfigüre edilir. +# - Parantez içinde fiziksel pin numarası verilmiştir. +# +# Güç / Ortak hatlar: +# 3.3V : Fiziksel 1, 17 +# 5V : Fiziksel 2, 4 +# GND : Fiziksel 6, 9, 14, 20, 25, 30, 34, 39 +# +# 1-Wire (DS18B20 hattı – tipik kullanım): +# GPIO4 (BCM4) → Fiziksel 7 +# +# Dış ortam DHT11: +# DHT11_OUTSIDE_PIN = 5 → BCM5 (Fiziksel 29) +# +# ADC / MCP3008 (SPI0): +# ADC_SPI["ce"] = 8 → BCM8 (Fiziksel 24, CE0) +# ADC_SPI["miso"] = 9 → BCM9 (Fiziksel 21, MISO) +# ADC_SPI["mosi"] = 10 → BCM10 (Fiziksel 19, MOSI) +# ADC_SPI["sclk"] = 11 → BCM11 (Fiziksel 23, SCLK) +# +# Brülör grubu röleleri (BURNER_GROUPS[0]): +# igniter_pin = 16 → BCM16 (Fiziksel 36) +# circulation["circ_1"]= 26 → BCM26 (Fiziksel 37) +# circulation["circ_2"]= 24 → BCM24 (Fiziksel 18) +# +# PWM / LED çıkışları (OUTPUT_GPIO): +# "buzzer" → GPIO18 → BCM18 (Fiziksel 12) [PWM] +# "rgb_r" → GPIO12 → BCM12 (Fiziksel 32) [PWM] +# "rgb_g" → GPIO13 → BCM13 (Fiziksel 33) [PWM] +# "rgb_b" → GPIO19 → BCM19 (Fiziksel 35) [PWM] +# "led" → GPIO23 → BCM23 (Fiziksel 16) +# +# Girişler (INPUT_GPIO): +# "button" → GPIO21 → BCM21 (Fiziksel 40) +# "burner_contactor" → GPIO20 → BCM20 (Fiziksel 38) +# "circulation_contactor1" → GPIO27 → BCM27 (Fiziksel 13) +# "circulation_contactor2" → GPIO17 → BCM17 (Fiziksel 11) +# +# Notlar: +# - Basınç ve gaz sensörleri için: +# pressure_sensor / gas_sensor pinleri, sensör BESLEME/ENABLE hattıdır. +# Analog ölçüm, MCP3008 üzerindeki ADC_CHANNELS üzerinden yapılır: +# "pressure" → CH0 +# "gas" → CH1 +# "rain" → CH2 +# "ldr" → CH3 +# - GPIO2/3 (fiziksel 3/5) I2C hattı, şimdilik boş tutulmuştur. +# - GPIO14/15 (fiziksel 8/10) UART hattı, debug/ileride kullanım için boş. +# ------------------------------------------------- diff --git a/document/abrulor_pinout_annotated.png b/document/abrulor_pinout_annotated.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce24d5ad0af000cdd3ee71382becedc822ff5ea GIT binary patch literal 648744 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 z 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 jF2*Ju4H-0PBc(Nr4G1fM{(HdFjthW-=n%1WC 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 literal 0 HcmV?d00001 diff --git a/ebina_log.sql b/ebina_log.sql new file mode 100644 index 0000000..bf878d5 --- /dev/null +++ b/ebina_log.sql @@ -0,0 +1,3 @@ +-- DBText log file for table ebrulor_log +-- created at 2025-11-22T16:18:17.441370 + diff --git a/ebuild/__init__.py b/ebuild/__init__.py new file mode 100644 index 0000000..7c08fc4 --- /dev/null +++ b/ebuild/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +"""ebuild ana paketi.""" + +__title__ = "ebuild" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina otomasyonu, ısıtma/soğutma/sulama sistemleri için temel paket" +__version__ = "0.1.0" +__date__ = "2025-11-20" diff --git a/ebuild/__pycache__/__init__.cpython-39.pyc b/ebuild/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13ce0f9b97937bf9cdc9d8bc215460555f74441a GIT binary patch literal 391 zcmYjN%}T>S5Z3bnwRk?9{UXT zDSGuSJh^EQoMC6?`-Yj>85|7y#0fh;l0A=*?;89U$B`@d^r17HFv30Nai96T#acXI z0dKQ5@65@#TOEiOD^pG}M_S-Q7#Xro!&RdPkz~Tqdo0o5ijL@T?n3>BMh@x8O@ij` z>3M8#-I#0X8YrVO)GL+SQ@UB}&DvxbX|;K`yTGQHA=OeFk)@)PRDONPoH``ZW_Z<( z!)X{-{aHLan@p#ZS^PNeY`Xwly#la303%H*0JePqv?fudqxS&{TNX;!2?v&<)KcXx z({q(*9Q{ekzy1;>&o%9q%2Y(XSQF(wHX0A*`?*}^)o#1Su= zCD7J->RbPWW<1lkzGSMG{(&fe0#BW3U-;IyCT<${oaIHybUf2?2OrL!gLB!l3(%RI zOepvp?=IC(XB6dcH2LxG8cwzpCDciW6$KOsHI!zEg+dC1Sr|sx2t-%}qAUtA7K2eX z3UL;PF*XJYOF)8+!#JCO2{s9n>=ImJQ!vFYqx}k8X45Fo;57?Z*c?o=dGuMpD~Zl3bBgC2vc9 zDtSk8RdNlve!9r6Li$Hz11`q<^qJEnTZB!x3-@r`MQIc6;~))5J-&_3 z(aKOk`yDW#3O_rIA4J%PxC_^DM?ZobOX2k~nCu2vYzb_36Kd=e*k#M`9A3a4FxWkf zuv_qRj2C7r@C&BGFD*s=RhQ0^8VbgpR;%qfUcKGwusQdoUvB{4Z?|6654iAKUcKp_ zESKHGrt77iIl}Rr*Qw>y4GYE2Z_({WY9)K*MD#t=V#x%X*#JBr|GoL z&r&P>IBM$rtaEbI&*JzV`DXw>4q>S zi;4D2zvCTH&5H7mr)sz_X14mmcZ{jX|5Bpgl&RGcuIIe_=4~`;Su2>;Q`@3;T~a=kRhZA>x4DJ9m1!C+k_Ru zEy6P4CSeJoF4q6~?%likw}kHqZxP*p5xytZ|dm(Qk>ix zD(PgR@;Vs6WM*>Hns$8&@ijJPcbBH+C41Y>RA>(s&J`$3}PdYldk z$`O2b+&mUR+3~jdXfv%w-(Q4Wv^*q>nBS+?e*Ks8Hw`z1FUG!el=6HJ7qNwULB~zd z!4q@@MGg@pS7~g^M^p6WE+I*45h&c^a>h z>*RsE@1|T_e7jjcQseKX#~uqV`r zPsi;1&y6E&v?GF%J?A8dTkV#d`gE+G(dUB2tYd-e!n@yWx`M?t-}9R-7JFWAc`mLY zou(Cji4GO@c97uw6+VEQzy+Q4V2pFG?lo{uHpll4+XCfr&X0X@-0qM8C%wzd+;**4$`vaGt`!R0vQ5p_3wyz=RP!BOv$<`QbW^KjbvD)0 z>Mx46G_lJ=Z+xJj^K39P)L6P*HHsCRXIU>AB`H?2re4-b8%&h77u=}XC7ouoC|Sjv z&P&B|KRkNQ*DO6p4@r|=(yBDKf`#pxS!t!4}Q+=1JY3yQoCL8Z7N_cG8M1NAz z%2;`#Khve9R~D_*Vl#sxZ4I{^`&+a1KPlqZ_%=wqU0pwHH{JE4-oN&G@4tO;`{`f& z+VSfk{&~^~cmuBF%-KW+OvQ?0RT0Cf>#p$x!l#SWGez4$+9= h!25TR|8E`&e;fIGWCim?@w%uW+>09iJ{F6I{sXSB^bG(2 literal 0 HcmV?d00001 diff --git a/ebuild/__pycache__/config_statics.cpython-39.pyc b/ebuild/__pycache__/config_statics.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..165c3e63620d73367f889a2ae9b3c519856e8c5c GIT binary patch literal 2674 zcmZ`)OLODK5eE1csR#8~?L)gZybtZtS*=KlqNK!e1d8hQ}6vzfCSR|mr z!;bg|a?T~Ws47*yxRTr6ecMe{%BP%>Q!1C>o}^NaW2XnCBGE~JVo!fx_k7dn84&8i zLXyL){K+HTS>w1rGjQ`-L~zJ)y!{o=alipT+p=+ z9&nKPoF{kSefR-9hsf~VunF4ZY*u4xxF{qAtdzT^D zzl`WSc`%)G8!I`ujN-f>l6M9ic^4iK0ekQs;)n1f@(4Z{@bF{!a1g=@e)2g#;Bh>} zkpnTXCA48g6>{B! zy*>Z_3|lPbiv8Y>ANwAg?Wx%t5hRn6|Y^O#n7`}%jk7G(SFYatg@c~B_s?d|9C z#X>RXrZMBq&)>d2yUxmI!a?3{v3PKmHzBgc!VFO;_SM4fL}{FS>5jDv;aGJFE_?Rs zn=g$C-WkucZN3mns`Fgf^}`tT;`+eQ9nJDt1^zuWnXq-6MHYIx)pK!Iu=P}(gv^eZS(Hsr-KZoJ4XO*)3FJs}pxV^d4BNEG(z&JCwrgoqqOJb{PemqV zv5oTCU+|URocQddTFhj^{_n5+ARCG281R9yY&sG@WB%qfVLf4fpfSnN|BAqR%vg3B zGf|T4^#|0_hNcR5ejU|v+;ft!PhAJh&kQd%33*Xw-UO)d6jdvlaJx-&$~Vyf$$nil#gO3z*E+_YH$ z!Ka#KvlB(V1f`%ljGixb7yue=xoZQ{k*SQFb*r%@*>*8*}`s+T3X zLe~DnwO+N_(n+J66Oc!eR4Iw&msGAd@fn(Oy+!T@ z5v9=<+Y&u)bQGL7*)oE{gy4EoT`bik*4qGz<+l7W=E~J$lAdxUu_e(XMf!*=O_`?H z##(WK6t;`4#%d*VO0`5AN<~sgnz`l13GN3K>y3&;78rA_l$=z_=KY4VYIr&W^YzyD zsX5ZN+4l{x@oRsNE#AnC2bmL9KJ?AM0leSm!~g&Q literal 0 HcmV?d00001 diff --git a/ebuild/__pycache__/config_variables.cpython-39.pyc b/ebuild/__pycache__/config_variables.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6b94740f5c6f88a799cea0c7d1e7a80034f3a26 GIT binary patch literal 2378 zcma)-OHIY;MlUy{|=7xv)A?p<|q z=RBTYN%;J_gu)WuwcorR4|tddyx=Q)nHRd45B#hP0?ZFV7JzORgb?e79u|Ty>j5td zLoe%v2#Y`;>w|Ob9Q3n(v<<)jJCFTAyocaC8-_tP0z)wDc#$KLqmpBiQOOIE7bV9f zFG*gOydrs3Qjz>h@|xsz$s3YiOHN4Ml$?}|N#2sYEjcAQEjfdn-5+P85dW;r!D%~7 zpV*JGF_?!ta2MMh?9IahHqub9WjWQ8Z2`zD3iseXJlOES;tyWT^l-xmkKi#p+3$v@ zummbvmeG=g6k0S$Lq=LwAPe6>9Cb>c_^TL3UpY7=lh`zKf8b{b`e)_ z-0`qW;4?h2VtpA`Uct*=t2Q_l)Z_(y}50>$}>w?uC=R7DAx?^*1ok|=bAE^ z+_c=xsu`=NG0frjR{7}Q{kv^T*{(ued21_22eqRE7Zp3`gmHvjwuPfOhd(+M1=`hp zS<_x1J~KBH-wP+=iM!KtbJK}<6Zf}=1x0nOUUN67Vvpzdr!ilThai;RfM4A~x>)aeRF2{7Lvg_=sr!MfjWW58)F5 z?_)vpB7Ed6(M3H!>1br4n?#8a^?C^OMQQdDB7{Byep@`ve!>7k$N=OfsNh)iG>f3R zMT|hhIL#v86f{UNO`tIg8oi)-5OV~Y7C{pv?hq(TbC57Z7$%GmMiD}egpnW3EF*v_F*F|54Tg<;Ol~RC#GCzWxkIOxd3%qLu>2(J8N6P zK^z?joSZn;)mjg^B`=a|--f+zD>k0CDt;4Up)<3J6uvGp1j-q^-00>Us_UFLd{vwp z&RxeX+bD)Px9aX@RbaoD^PRfbsn*DV!dqL^oN5Jy5PDlKs##Amo#82Mxs+ie%cX2C zl`Ukrn#pj(EUKoKdCi8Uny+Z8$xS_{71csgWBo0y_9|;i6C3Dw;|m#$C)rR(V`%28 zo-LTDjO5iV=fSMmx0?H8sUowPIGM z6vHny?U`0cwT8Q_>xL})M4M7y8!Xx`Bb_a37_dFGyt>K;Q(Decxye!BD|)Gzd(FlS z^##qTNlB6#PD0x-)SA(3UgP=;tysiqFxa56qQC6Oyr7#}Tc_r79lg=$P2*^Bja0K_ z{NxeOX=e~V&dzRDx9!=j*3V(K{VO{AkJJb~qCZ2~enQ`?8l7l=AmsCV+bz)PooG&; mU1$kj@t(BE$6!y?8~qdvNcKd$;bXt=OGb|UAN*nT3;YYMjCiB~ literal 0 HcmV?d00001 diff --git a/ebuild/config_runtime.py b/ebuild/config_runtime.py new file mode 100644 index 0000000..d2caeb9 --- /dev/null +++ b/ebuild/config_runtime.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "ebuild_config_runtime" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Çalışma zamanı (runtime) ısıtma/soğutma parametreleri" +__version__ = "0.3.0" +__date__ = "2025-11-22" + +""" +ebuild/config_runtime.py + +Sık değişebilen, sistem durmadan güncellenebilen parametreler: +- ısı aralıkları +- kazan limitleri +- saatlik tasarruf haritaları +- override tabloları +""" + +# ------------------------------------------------- +# Sistem / Hedefler +# ------------------------------------------------- +CFG_DEBUG = 1 +BUILDING_AGG_STRATEGY = "robust" +BUILD_HEAT_TOLERANCE = 1.00 # ısı dengeleme toleransı +BUILD_EXIT_HEAT = 0 # 0= bina ort ısı, 1= üst kat, 2= alt kat, 3= en düşük daire ısısı +BUILDING_RANGE_C = (18.0, 28.0) # bina hedef aralığı +BUILDING_SETPOINT_C = 23.0 # seçili bina konfor sıcaklığı +BUILDING_INCREMENT_C = 0.5 # B modunda kademe adımı (ileride kullanacağız) + +MAX_OUTLET_C = 45.0 # kazan çıkış emniyet limiti +OUTSIDE_LIMIT_HEAT_C = 30.0 +USED_OUTSIDE_ELAPSED_S = 300 # 5 dk’da bir ‘used_outside’ güncelle +BURNER_COMFORT_OFFSET_C = 1.0 # seçili konfor sıcaklığı offset’i +CIRCULATION_MIN_RETURN_C = 25.0 # Çıkış ısısı bu değerin ALTINA düşerse pompalar DURUR +OUTSIDE_SMOOTH_SECONDS = 300 +BUILDING_READ_PERIOD_S = 300 # bina istatistik okuma periyodu + +# Hafta sonu lüks artırımı +WEEKEND_HEAT_BOOST_C = 2.0 +WEEKEND_DAYS = (5, 6) # 5=Cumartesi, 6=Pazar + # Böylece debug sırasında bu min süreleri config’ten 0 yapar gerçekte devreye alırken 60–300 saniye gibi gerçekçi değerler verirsin +BURNER_MIN_RUN_SEC = 0 +BURNER_MIN_STOP_SEC = 0 +BURNER_HYSTERESIS_C = 0 + +# ------------------------------------------------- +# Ateşleme bant haritaları +# ------------------------------------------------- +BURNER_FIRE_SETPOINT_MAP = { + -9: {"fire": 70}, -8: {"fire": 69}, -7: {"fire": 67}, -6: {"fire": 66}, -5: {"fire": 65}, + -4: {"fire": 63}, -3: {"fire": 62}, -2: {"fire": 61}, -1: {"fire": 59}, 0: {"fire": 58}, + 1: {"fire": 57}, 2: {"fire": 55}, 3: {"fire": 54}, 4: {"fire": 53}, 5: {"fire": 51}, + 6: {"fire": 50}, 7: {"fire": 48}, 8: {"fire": 47}, 9: {"fire": 46}, 10: {"fire": 44}, + 11: {"fire": 43}, 12: {"fire": 42}, 13: {"fire": 40}, 14: {"fire": 39}, 15: {"fire": 38}, + 16: {"fire": 36}, 17: {"fire": 35}, +} + +DELTA_T_MAP_HOURLY = { + 0: 6, 1: 6, 2: 6, 3: 6, 4: 6, 5: 6, 6: 7, 7: 7, 8: 7, 9: 7, 10: 7, 11: 7, + 12: 6, 13: 6, 14: 6, 15: 6, 16: 6, 17: 6, 18: 7, 19: 7, 20: 7, 21: 7, 22: 7, 23: 7, +} + +SAVING_T_PERCENT_HOURLY = { + 0: 95, 1: 90, 2: 85, 3: 85, 4: 90, 5: 95, 6: 95, 7: 100, 8: 100, 9: 95, 10: 90, 11: 95, + 12: 100, 13: 95, 14: 90, 15: 85, 16: 90, 17: 95, 18: 95, 19: 100, 20: 100, 21: 100, 22: 100, 23: 100, +} + +# ------------------------------------------------- +# Zaman bazlı override (örnekler) +# ------------------------------------------------- +HEAT_TIME_OVERRIDES = [ + { + "enable": True, + "start": "19:00", + "end": "22:00", + "days": [0, 1, 2, 3, 4, 5, 6], + "outside_c": [7, 18], + "set_fire_c": 45, + "note": "sabah konfor", + }, + { + "enable": False, + "start": "12:00", + "end": "13:30", + "days": [0, 1, 2, 3, 4], + "outside_c": [14, 20], + "building_c": 27, + "note": "öğle sıcak tut", + }, + { + "enable": False, + "start": "16:00", + "end": "18:00", + "days": [5, 6], + "outside_c": [14, 18], + "set_fire_c": 50, + "note": "akşam artır", + }, + { + "enable": False, + "start": "20:30", + "end": "22:00", + "days": [0, 1, 2, 3, 4, 5, 6], + "outside_c": [8, 15], + "set_fire_c": 38, + "building_c": 26, + "note": "gece ekonomik", + }, +] + +SHOW_OVERRIDE_NOTE = 0 # 0: not yazma, 1: yaz +SHOW_ALL_OVERRIDES = 1 # 1: dış ısı aralığı eşleşmese de listele (gün eşleşmesi yine aranır) + +# ------------------------------------------------- +# Mevsim parametreleri +# ------------------------------------------------- +SEASON_SPRING_SAVE_DAYS = 20 +SEASON_AUTUMN_SAVE_DAYS = 20 +xSEASON_SPRING_SAVE_DAYS = (5, 20) # 5–20 Nisan +xSEASON_AUTUMN_SAVE_DAYS = (15, 30) # 15–30 Eylül + +SEASON_PROVIDER = "SunHolidayInfo" +SEASON_LANG = "tr" +SEASON_NAMES = ("İlkbahar", "Yaz", "Sonbahar", "Kış") +SEASON_ENG = { + "İlkbahar": "Spring", + "Yaz": "Summer", + "Sonbahar": "Autumn", + "Kış": "Winter", +} +SPRING_HOURS = ["00:00", "22:00"] # 00 → sunset bazlı başlangıç +SPRING_START_MINUTE = 30 diff --git a/ebuild/config_statics.py b/ebuild/config_statics.py new file mode 100644 index 0000000..6c4a882 --- /dev/null +++ b/ebuild/config_statics.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "ebuild_config_statics" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina ve donanım topolojisi için statik konfigürasyon" +__version__ = "0.3.0" +__date__ = "2025-11-22" + +""" +ebuild/config_statics.py + +Statik (mimari) konfigürasyon +----------------------------- +Bu dosyada bina ve donanım topolojisine ait, sık değişmeyen ayarlar tutulur. +Rasp2 pin eşlemeleri, brülör topolojisi, bina/geo bilgileri vb. +""" + +# ------------------------------------------------- +# Brülör çalışma modu +# ------------------------------------------------- +# F : Dış ısıya bağlı kazan kontrolü +# B : Bina ortalama sıcaklığa bağlı kontrol +BUILD_BURNER = "F" # ilk deneme F +BURNER_DEFAULT_ID = 0 # seçili brülör id + +# ------------------------------------------------- +# Bina kimliği / konum +# ------------------------------------------------- +BUILDING_NAME = "Gunes Apt" +BUILDING_LOCATION = "Ankara" +BUILDING_LABEL = "Resat Nuri" + +GEO_CITY = "Ankara" +GEO_COUNTRY = "Turkey" +GEO_TZ = "Europe/Istanbul" +GEO_LAT = 39.92077 +GEO_LON = 32.85411 + +# Lisans ve sistem ana anahtarı +BUILDING_LICENCEID = 10094 +BUILDING_SYSTEMONOFF = 1 # 1=On, 0=Off + +# ------------------------------------------------- +# Daire / oda topolojisi (DS18B20) +# ------------------------------------------------- +# Her kayıt: bina içindeki flat/room dağılımı +FLAT_AREA = [ + {"serial": "28-00000660e983", "flat_no": 2, "room_no": 0, "floor": 1, "direction": 5, "size_m2": 0.0}, + {"serial": "28-0000066144f9", "flat_no": 22, "room_no": 0, "floor": 1, "direction": 7, "size_m2": 0.0}, + {"serial": "28-000006605827", "flat_no": 11, "room_no": 0, "floor": 4, "direction": 1, "size_m2": 0.0}, + {"serial": "28-000005fd46c4", "flat_no": 24, "room_no": 0, "floor": 2, "direction": 7, "size_m2": 0.0}, + {"serial": "28-00000660dc99", "flat_no": 25, "room_no": 0, "floor": 2, "direction": 7, "size_m2": 0.0}, + {"serial": "28-00000141b977", "flat_no": 28, "room_no": 0, "floor": 2, "direction": 7, "size_m2": 0.0}, + {"serial": "28-000006616fc3", "flat_no": 6, "room_no": 0, "floor": 2, "direction": 1, "size_m2": 0.0}, + {"serial": "28-00000660ca02", "flat_no": 1, "room_no": 0, "floor": 1, "direction": 4, "size_m2": 0.0}, +] + +# ------------------------------------------------- +# Hat sensörleri (tamamen DS18B20) +# ------------------------------------------------- +# Dış ısı +OUTSIDE_SENSOR_ID = "28-000000b2aa05" +OUTSIDE_SENSOR_NAME = "Dış Isı 1" + +# Kazan çıkış +BURNER_OUT_SENSOR_ID = "28-946778126461" +BURNER_OUT_SENSOR_NAME = "Çıkış Isı 2" + +# Dönüş hatları +RETURN_LINE_SENSOR_IDS = [ + "28-566978126461", + "28-506478126461", + "28-46fa45126461", +] + +RETURN_LINE_SENSOR_NAME_MAP = { + "28-566978126461": "Kuzey Hat4", + "28-506478126461": "Güney Hat3", + "28-46fa45126461": "Guney Bat, 5", +} + +# ------------------------------------------------- +# Donanım / röle / pin eşlemeleri +# ------------------------------------------------- +GPIO_BOARD_REVISION = 3 + +BURNER_IGNITER_CH = "igniter" + +RELAY_GPIO = { + "igniter": 16, + "circulation_a": 26, + "circulation_b": 24, +} +# Brülör grupları – RelayDriver buradan beslenir +BURNER_GROUPS = { + 0: { + "name": "MainBurner", + "location": "Sol binada", + "igniter_pin": 16, # BCM 16 → phys 36 (örnek) + "circulation": { + "circ_1": {"channel": "circulation_a", "pin": 26, "default": 1}, + "circ_2": {"channel": "circulation_b", "pin": 24, "default": 0}, + }, + }, + # 1: {...} # ilerde ikinci brülör +} + +# Temel röle kanalları (soyut isim → GPIO) +RELAY_GPIO = { + "igniter": 16, # BCM 16, Fiziksel 36 + "circulation_a": 26, # BCM 26, Fiziksel 37 + "circulation_b": 24, # BCM 24, Fiziksel 18 + "gas_sensor": 22, # BCM 22, Fiziksel 15 + "pressure_sensor": 6, # BCM 6, Fiziksel 31 +} + +PUMP_HAS_DUAL_PUMPS = True +PUMP_FEEDBACK_INPUT_PINS = [] +PUMP_ROTATE_HOURS_DEFAULT = 24 + +# ------------------------------------------------- +# Buzzer + RGB LED +# ------------------------------------------------- +BUZZER_ENABLE = 1 +BUZZER_ACTIVE_HIGH = True +BUZZER_BASE_FREQ = 2000 # Hz + +BUZZER_PATTERNS = { + "cfg_reload": [ + (1, 10), + ], + "startup": [ + (1, 80), + (0, 0), + ], + "shutdown": [[200, 0, 1]], + "reload": [[300, 100, 1], [120, 100, 1], [300, 0, 1]], + "alarm": [[500, 200, 2], [500, 200, 2], [500, 200, 2]], +} + +OUTPUT_GPIO = { + "buzzer": 18, # BCM 18, Fiziksel 12 - PWM – buzzer + "rgb_r": 12, # BCM 12, Fiziksel 32 - PWM – kırmızı + "rgb_g": 13, # BCM 13, Fiziksel 33 - PWM – yeşil + "rgb_b": 19, # BCM 19, Fiziksel 35 - PWM – mavi + "led": 23, # BCM 23, Fiziksel 16 - basit LED +} +RGB_ORDER = "GRB" +RGB_COMMON_ANODE = False +RGB_BASE_FREQ = 1000 # Hz + +INPUT_GPIO = { + "button": 21, # BCM 21, Fiziksel 40 + "burner_contactor": 20, # BCM 20, Fiziksel 38 + "circulation_contactor1": 27, # BCM 27, Fiziksel 13 + "circulation_contactor2": 17, # BCM 17, Fiziksel 11 +} diff --git a/ebuild/core/__init__.py b/ebuild/core/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/ebuild/core/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/ebuild/core/__pycache__/__init__.cpython-39.pyc b/ebuild/core/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9a0efc6684afbecf5efa7d8e4afbaa121e6ed2 GIT binary patch literal 135 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 literal 0 HcmV?d00001 diff --git a/ebuild/core/__pycache__/season.cpython-39.pyc b/ebuild/core/__pycache__/season.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39cfce7d32712c55979615ef3b735e030c0bb28d GIT binary patch literal 8564 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 None: + self.name = name + self.state: Optional[str] = None + self.last_raw: Optional[int] = None + # Gaz için latched alarm gibi ek alanlar: + self.latched_alarm: bool = False + + def update(self, raw: Optional[int]) -> None: + self.last_raw = raw + # Şimdilik state hesaplamıyoruz; ileride eşiğe göre doldurulabilir. + self.state = None + + +class AnalogSensorsHub: + """ + MCP3008 ADC üzerinden basınç, gaz, yağmur, LDR gibi sensörleri yöneten hub. + + Beklenti: + --------- + adc nesnesinin en azından şu fonksiyonu sağlaması: + - read_channel(ch: int) -> int (0..1023 arası değer) + """ + + def __init__(self, adc) -> None: + self.adc = adc + + # Her kanal için basit state objeleri + self.pressure = _SimpleChannelState("pressure") + self.gas = _SimpleChannelState("gas") + self.rain = _SimpleChannelState("rain") + self.ldr = _SimpleChannelState("ldr") + + # Kanalları sabitliyoruz; istersen config'ten de alabilirsin. + self.pressure_ch = 0 + self.gas_ch = 1 + self.rain_ch = 2 + self.ldr_ch = 3 + + def _safe_read(self, ch: int) -> Optional[int]: + """ + ADC'den güvenli okuma. Hata olursa None döndürür. + """ + if self.adc is None: + return None + + try: + val = self.adc.read_channel(ch) + return int(val) + except Exception: + return None + + def update_all(self) -> Dict[str, Any]: + """ + Tüm kanalları okuyup state nesnelerini günceller. + + Dönüş: + { + "pressure": , + "gas": , + "rain": , + "ldr": , + } + """ + vals: Dict[str, Any] = {} + + p_raw = self._safe_read(self.pressure_ch) + g_raw = self._safe_read(self.gas_ch) + r_raw = self._safe_read(self.rain_ch) + l_raw = self._safe_read(self.ldr_ch) + + self.pressure.update(p_raw) + self.gas.update(g_raw) + self.rain.update(r_raw) + self.ldr.update(l_raw) + + vals["pressure"] = p_raw + vals["gas"] = g_raw + vals["rain"] = r_raw + vals["ldr"] = l_raw + + return vals + + +if __name__ == "__main__": + # Basit demo: sahte ADC ile + class DummyADC: + def read_channel(self, ch: int) -> int: + return 512 + ch # uydurma değerler + + hub = AnalogSensorsHub(DummyADC()) + values = hub.update_all() + print("AnalogSensorsHub demo:", values) + print("Gas latched_alarm:", hub.gas.latched_alarm) diff --git a/ebuild/core/building.py b/ebuild/core/building.py new file mode 100644 index 0000000..4199adf --- /dev/null +++ b/ebuild/core/building.py @@ -0,0 +1,590 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "building" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina / daire / sensör ve brülör topolojisi sürücüsü" +__version__ = "0.4.3" +__date__ = "2025-11-22" + +""" +ebuild/core/building.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- Statik konfigürasyondan (config_statics) bina, geo ve sensör topolojisini yükler. +- FLAT_AREA içindeki DS18B20 sensörlerini daire/oda bazında yönetir. +- Bina ortalama sıcaklık istatistiklerini üretir. +- Brülör grupları (BURNER_GROUPS) ve hat sensörleri (dış, çıkış, dönüş) için + başlangıçta okunabilir bir özet verir. +- SeasonController ile mevsim / güneş / tatil bilgisi sağlar. + +Not +--- +Bu modül, hem bağımsız test aracı olarak `python3 -m ebuild.core.building` +şeklinde çalışabilir, hem de BurnerController gibi üst seviye kontrol +modülleri tarafından kullanılabilir. +""" + +import os +import json +import time +import datetime +import statistics +from collections import defaultdict +from typing import Dict, List, Optional, Any + +from .season import SeasonController +from ..io.dbtext import DBText +from .. import config_statics as cfg_s +from .. import config_runtime as cfg_v + + +# ------------------------------------------------------------------ +# Yardımcı sabitler +# ------------------------------------------------------------------ +FlatDirection = { + 0: "Kuzey-Kuzey", + 1: "Kuzey-Doğu", + 2: "Kuzey-Batı", + 3: "Güney-Güney", + 4: "Güney-Doğu", + 5: "Güney-Batı", + 6: "Doğu-Doğu", + 7: "Batı-Batı", +} + +ValveType = { + 0: "Yok", + 1: "Dijital", + 2: "PWM", + 3: "Analog", + 4: "Enkoder", + 5: "Modbus", + 6: "CANbus", +} + + +# ------------------------------------------------------------------ +# DS18B20 sensör sınıfı +# ------------------------------------------------------------------ +class EDSensor: + """Tek bir DS18B20 sensörünü temsil eder.""" + + def __init__(self, serial: str, flat_no: int, flat_direction: int, floor: int, room_no: int = 0) -> None: + self.serial = serial + self.flat_no = flat_no + self.floor = floor + self.room_no = room_no + self.flat_direction = flat_direction + self.device_path = f"/sys/bus/w1/devices/{serial}/w1_slave" + self.flat_check = 0 + self.is_connected = True + + def read_temperature(self) -> Optional[float]: + try: + with open(self.device_path, "r") as f: + lines = f.readlines() + if lines[0].strip().endswith("YES"): + pos = lines[1].find("t=") + if pos != -1: + raw = lines[1][pos + 2 :] + t_c = float(raw) / 1000.0 + self.is_connected = True + return t_c + except Exception: + self.flat_check += 1 + self.is_connected = False + return None + + +# ------------------------------------------------------------------ +# Daire nesnesi +# ------------------------------------------------------------------ +class Flat: + """Daire nesnesi: yön, kat ve sensör ilişkisi.""" + + def __init__(self, flat_no: int, flat_direction: int, sensor: EDSensor, floor: int, room_no: int = 0) -> None: + self.flat_no = flat_no + self.flat_direction = flat_direction + self.sensor = sensor + self.floor = floor + self.room_no = room_no + self.last_heat: Optional[float] = None + self.last_read_time: Optional[datetime.datetime] = None + + +# ------------------------------------------------------------------ +# Bina sınıfı +# ------------------------------------------------------------------ +class Building: + """ + Bina seviyesi sürücü. + + config_statics üzerinden: + + BUILDING_NAME + BUILDING_LOCATION + BUILDING_LABEL + + GEO_CITY + GEO_COUNTRY + GEO_TZ + GEO_LAT + GEO_LON + + FLAT_AREA + BURNER_GROUPS + OUTSIDE_SENSOR_ID / NAME + BURNER_OUT_SENSOR_ID / NAME + RETURN_LINE_SENSOR_IDS / NAME_MAP + """ + + def __init__( + self, + name: Optional[str] = None, + location: Optional[str] = None, + bina_adi: Optional[str] = None, + logtime: bool = False, + logger: Optional[DBText] = None, + ) -> None: + # Bina bilgileri config_statics'ten + self.name = name or getattr(cfg_s, "BUILDING_NAME", "Bina") + self.location = location or getattr(cfg_s, "BUILDING_LOCATION", "Ankara") + self.bina_adi = bina_adi or getattr(cfg_s, "BUILDING_LABEL", "A_Binasi") + + # Coğrafi bilgiler + self.geo_city = getattr(cfg_s, "GEO_CITY", "Ankara") + self.geo_country = getattr(cfg_s, "GEO_COUNTRY", "Turkey") + self.geo_tz = getattr(cfg_s, "GEO_TZ", "Europe/Istanbul") + self.geo_lat = float(getattr(cfg_s, "GEO_LAT", 39.92077)) + self.geo_lon = float(getattr(cfg_s, "GEO_LON", 32.85411)) + + # Logger + self.logger = logger or DBText( + filename=getattr(cfg_s, "BUILDING_LOG_FILE", "ebina_log.sql"), + table=getattr(cfg_s, "BUILDING_LOG_TABLE", "ebrulor_log"), + app="ESYSTEM", + ) + + # Çalışma aralığı: 3 dakika (eski koddaki gibi) + interval_min = getattr(cfg_v, "BUILDING_SAMPLE_MINUTES", 3) + self.interval = datetime.timedelta(seconds=60 * interval_min) + self.next_run = datetime.datetime.now() + + self.flats: Dict[int, Flat] = {} + self.last_max_floor: Optional[int] = None + self.logtime = logtime + + # Season / tatil bilgisi + try: + self.season = SeasonController.from_now() + except Exception as e: + print(f"⚠️ SeasonController.from_now() hata: {e}") + self.season = None + + # Daireleri FLAT_AREA'dan oluştur + self._load_statics_from_flat_area() + + # Bina genel istatistiği (ilk deneme) + try: + self.get_building_temperature_stats() + except Exception: + pass + + def pretty_summary(self) -> str: + """ + Bina durumunu okunabilir bir metin olarak döndür. + Konsola bastığımız bilgilerin string versiyonu. + """ + import io + import contextlib + + buf = io.StringIO() + with contextlib.redirect_stdout(buf): + # İstersen istatistiği de özetin içine kat: + self.get_building_temperature_stats() + + # Zaten mevcut olan konsol fonksiyonlarını kullanıyoruz + self._print_header() + self._print_sun_and_season() + self._print_burner_topology() + self._print_line_sensors() + self.print_config() + + return buf.getvalue() + + + def get_hat_sensor_by_id(self, sensor_id: str): + """ + Verilen DS18B20 ID'sine göre hat sensör nesnesini döndür. + Yoksa None döndür. + """ + return self.hat_sensors.get(sensor_id) # yapıya göre uyarlarsın + + # ------------------------------------------------------------------ + # Statik konfigürasyondan daire/sensör yükleme + # ------------------------------------------------------------------ + def _load_statics_from_flat_area(self) -> None: + """config_statics.FLAT_AREA içinden daire/sensörleri yükler.""" + self.flats = {} + flat_area = getattr(cfg_s, "FLAT_AREA", []) + for item in flat_area: + serial = item.get("serial") + flat_no = int(item.get("flat_no", 0)) + room_no = int(item.get("room_no", 0)) + floor = int(item.get("floor", 0)) + direction = int(item.get("direction", 0)) + if not serial: + continue + sensor = EDSensor(serial, flat_no, direction, floor, room_no=room_no) + # bağlantı testi + sensor.read_temperature() + flat = Flat(flat_no, direction, sensor, floor, room_no=room_no) + self.flats[flat_no] = flat + + print("✅ Building: statics yüklendi") + + # ------------------------------------------------------------------ + # Başlangıç çıktıları + # ------------------------------------------------------------------ + def _print_header(self) -> None: + print(f"🏢 Bina adı : {self.bina_adi}") + print(f"📍 Konum : {self.name} / {self.location}") + print( + f"🌍 Geo : {self.geo_city}, {self.geo_country} " + f"({self.geo_lat}, {self.geo_lon}) tz={self.geo_tz}" + ) + print(f"🏠 Daire/oda sayısı: {len(self.flats)}\n") + + def _print_sun_and_season(self) -> None: + """SeasonController üzerinden sunrise / sunset ve mevsim / tatil bilgisini yazar.""" + if not self.season or not getattr(self.season, "info", None): + print("☀️ Sunrise/Sunset : --:-- / --:--") + print("🧭 Mevsim / Tatil : (bilgi yok)\n") + return + + info = self.season.info + sunrise = info.sunrise.strftime("%H:%M") if info.sunrise else "--:--" + sunset = info.sunset.strftime("%H:%M") if info.sunset else "--:--" + + print(f"☀️ Sunrise/Sunset : {sunrise} / {sunset}") + if info.season_start and info.season_end: + print( + f"🧭 Mevsim / Tatil : {info.season} " + f"({info.season_start} → {info.season_end}), " + f"Tatil={info.is_holiday} {info.holiday_label}" + ) + else: + print( + f"🧭 Mevsim / Tatil : {info.season}, " + f"Tatil={info.is_holiday} {info.holiday_label}" + ) + print() + + def _print_burner_topology(self) -> None: + """config_statics.BURNER_GROUPS bilgisini okunaklı yazar.""" + groups = getattr(cfg_s, "BURNER_GROUPS", {}) + if not groups: + print("🔥 Brülör topolojisi: tanımlı değil (BURNER_GROUPS boş).\n") + return + + print("🔥 Brülör Topolojisi (config_statics.BURNER_GROUPS):") + for bid, info in groups.items(): + name = info.get("name", f"Burner{bid}") + loc = info.get("location", "-") + ign = info.get("igniter_pin", None) + print(f" #{bid}: {name} @ {loc}") + print(f" Igniter pin : {ign}") + circ = info.get("circulation", {}) + if not circ: + print(" Pompalar : (tanımlı değil)") + else: + print(" Pompalar :") + for cname, cinfo in circ.items(): + pin = cinfo.get("pin") + default = cinfo.get("default", 0) + print(f" - {cname:<7} → pin={pin:<3} default={default}") + print() + + # ------------------------------------------------------------------ + # Hat sensörleri: dış / çıkış / dönüş + # ------------------------------------------------------------------ + def _read_ds18b20_raw(self, serial: str) -> Optional[float]: + """Seri numarası verilen DS18B20'den tek seferlik okuma.""" + path = f"/sys/bus/w1/devices/{serial}/w1_slave" + try: + with open(path, "r") as f: + lines = f.readlines() + if not lines or not lines[0].strip().endswith("YES"): + return None + pos = lines[1].find("t=") + if pos == -1: + return None + raw = lines[1][pos + 2 :] + return float(raw) / 1000.0 + except Exception: + return None + + def _print_line_sensors(self) -> None: + """ + Dış ısı, kazan çıkış ısısı ve dönüş hat sensörlerini (varsa) ekrana yazar. + config_statics içindeki: + OUTSIDE_SENSOR_ID / OUTSIDE_SENSOR_NAME + BURNER_OUT_SENSOR_ID / BURNER_OUT_SENSOR_NAME + RETURN_LINE_SENSOR_IDS + RETURN_LINE_SENSOR_NAME_MAP + kullanılır. + """ + outside_id = getattr(cfg_s, "OUTSIDE_SENSOR_ID", None) + outside_nm = getattr(cfg_s, "OUTSIDE_SENSOR_NAME", "Dış Isı 1") + burner_id = getattr(cfg_s, "BURNER_OUT_SENSOR_ID", None) + burner_nm = getattr(cfg_s, "BURNER_OUT_SENSOR_NAME", "Çıkış Isı 1") + return_ids = list(getattr(cfg_s, "RETURN_LINE_SENSOR_IDS", [])) + name_map = dict(getattr(cfg_s, "RETURN_LINE_SENSOR_NAME_MAP", {})) + + if not (outside_id or burner_id or return_ids): + # Hiç tanım yoksa sessizce geç + return + + print("🌡️ Hat sensörleri:") + # Dış ısı + if outside_id: + t = self._read_ds18b20_raw(outside_id) + if t is None: + print(f" - {outside_nm:<15}: ❌ Okunamadı ({outside_id})") + else: + print(f" - {outside_nm:<15}: {t:5.2f}°C ({outside_id})") + + # Kazan çıkış + if burner_id: + t = self._read_ds18b20_raw(burner_id) + if t is None: + print(f" - {burner_nm:<15}: ❌ Okunamadı ({burner_id})") + else: + print(f" - {burner_nm:<15}: {t:5.2f}°C ({burner_id})") + + # Dönüş hatları + for sid in return_ids: + nm = name_map.get(sid, sid) + t = self._read_ds18b20_raw(sid) + if t is None: + print(f" - Dönüş {nm:<10}: ❌ Okunamadı ({sid})") + else: + print(f" - Dönüş {nm:<10}: {t:5.2f}°C ({sid})") + print() + + # ------------------------------------------------------------------ + # İstatistik fonksiyonları + # ------------------------------------------------------------------ + def _summarize(self, values: List[float]) -> dict: + if not values: + return {"min": None, "max": None, "avg": None, "count": 0} + return { + "min": min(values), + "max": max(values), + "avg": round(statistics.mean(values), 2), + "count": len(values), + } + + def get_temperature_stats(self) -> str: + stats = { + "floors": defaultdict(list), + "directions": defaultdict(list), + "top_floor": [], + "building": [], + } + + max_floor = self.last_max_floor + + for flat in self.flats.values(): + temp = flat.sensor.read_temperature() + if temp is not None: + flat.last_heat = temp + flat.last_read_time = datetime.datetime.now() + stats["floors"][flat.floor].append(temp) + stats["directions"][flat.flat_direction].append(temp) + stats["building"].append(temp) + if max_floor is not None and flat.floor == max_floor: + stats["top_floor"].append(temp) + + result = { + "floors": {f: self._summarize(v) for f, v in stats["floors"].items()}, + "directions": { + d: self._summarize(v) for d, v in stats["directions"].items() + }, + "top_floor": self._summarize(stats["top_floor"]), + "building": self._summarize(stats["building"]), + } + return json.dumps(result, indent=4, ensure_ascii=False) + + def get_last_heat_report(self) -> str: + report = [] + for flat in self.flats.values(): + temp = flat.sensor.read_temperature() + now = datetime.datetime.now() + if temp is not None: + flat.last_heat = temp + flat.last_read_time = now + report.append( + { + "flat_no": flat.flat_no, + "room_no": flat.room_no, + "direction": flat.flat_direction, + "floor": flat.floor, + "serial": flat.sensor.serial, + "last_heat": flat.last_heat, + "last_read_time": flat.last_read_time.strftime( + "%Y-%m-%d %H:%M:%S" + ) + if flat.last_read_time + else None, + "is_connected": flat.sensor.is_connected, + "flat_check": flat.sensor.flat_check, + } + ) + return json.dumps(report, indent=4, ensure_ascii=False) + + def get_building_temperature_stats(self) -> Optional[dict]: + print("\n🌡️ Bina Genel Isı Bilgisi:") + all_temps: List[float] = [] + floor_temps: Dict[int, List[float]] = {} + now = datetime.datetime.now() + + # Log zamanı mı? + if now >= self.next_run: + self.logtime = True + self.next_run = now + self.interval + else: + self.logtime = False + + self.last_max_floor = None + + for flat in self.flats.values(): + temp = flat.sensor.read_temperature() + floor = flat.floor + + if temp is not None: + flat.last_heat = temp + flat.last_read_time = now + if self.last_max_floor is None or floor > self.last_max_floor: + self.last_max_floor = floor + else: + flat.last_heat = None + flat.last_read_time = None + + floor_temps.setdefault(floor, []) + if temp is not None: + all_temps.append(temp) + floor_temps[floor].append(temp) + if self.logtime: + self.logger.insert_event( + source=f"Sensor:{flat.sensor.serial}", + event_type="temperature", + value=temp, + unit="°C", + timestamp=now, + extra=f"Daire {flat.flat_no} Oda {flat.room_no} Kat {flat.floor}, Yön {flat.flat_direction}", + ) + + if not all_temps or not floor_temps: + print("❌ Hiç sıcaklık verisi alınamadı.\n") + return None + + min_temp = min(all_temps) + max_temp = max(all_temps) + avg_temp = sum(all_temps) / len(all_temps) + + min_floor = min(floor_temps.keys()) + max_floor = max(floor_temps.keys()) + + avg_min_floor = sum(floor_temps[min_floor]) / max(len(floor_temps[min_floor]), 1) + avg_max_floor = sum(floor_temps[max_floor]) / max(len(floor_temps[max_floor]), 1) + delta_t = abs(avg_max_floor - avg_min_floor) + + print( + " Min: {:.2f}°C | Max: {:.2f}°C | Avg: {:.2f}°C | Count: {}".format( + min_temp, max_temp, avg_temp, len(all_temps) + ) + ) + print(f" En Alt Kat ({min_floor}): {avg_min_floor:.2f}°C") + print(f" En Üst Kat ({max_floor}): {avg_max_floor:.2f}°C") + print(f" 🔺 Delta Isı (Üst - Alt): {delta_t:.2f}°C") + + if self.logtime: + self.logger.insert_event( + source="Sensor:min", + event_type="temperature", + value=min_temp, + unit="°C", + timestamp=now, + extra="", + ) + self.logger.insert_event( + source="Sensor:max", + event_type="temperature", + value=max_temp, + unit="°C", + timestamp=now, + extra="", + ) + self.logger.insert_event( + source="Sensor:avg", + event_type="temperature", + value=avg_temp, + unit="°C", + timestamp=now, + extra="", + ) + + return { + "min": min_temp, + "max": max_temp, + "avg": avg_temp, + "count": len(all_temps), + "min_floor": min_floor, + "max_floor": max_floor, + "avg_min_floor": avg_min_floor, + "avg_max_floor": avg_max_floor, + "delta_t": delta_t, + } + + # ------------------------------------------------------------------ + # Yardımcı + # ------------------------------------------------------------------ + def print_config(self) -> None: + if not self.flats: + print(f"📦 {self.bina_adi} için tanımlı daire yok.") + return + + print(f"\n📦 {self.bina_adi} içeriği:") + for flat_no, flat in self.flats.items(): + temp = flat.sensor.read_temperature() + durum = "✅ Bağlı" if temp is not None else "❌ Yok" + print( + " Daire {:<3} Oda {:<1} | Kat: {:<2} | Yön: {:<12} | Sensör: {:<18} | Durum: {} | AKTIF".format( + flat.flat_no, + flat.room_no, + flat.floor, + FlatDirection.get(flat.flat_direction, "Bilinmiyor"), + flat.sensor.serial, + durum, + ) + ) + + def run_forever(self, sleep_s: int = 5) -> None: + """Eski test aracı gibi: sürekli bina istatistiği üretir.""" + while True: + self.get_building_temperature_stats() + time.sleep(sleep_s) + + +# ---------------------------------------------------------------------- +# CLI +# ---------------------------------------------------------------------- +if __name__ == "__main__": + bina = Building() # Config'ten her şeyi alır + bina.run_forever() diff --git a/ebuild/core/building.py~ b/ebuild/core/building.py~ new file mode 100644 index 0000000..a95be4f --- /dev/null +++ b/ebuild/core/building.py~ @@ -0,0 +1,574 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "building" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina / daire / sensör ve brülör topolojisi sürücüsü" +__version__ = "0.4.3" +__date__ = "2025-11-22" + +""" +ebuild/core/building.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- Statik konfigürasyondan (config_statics) bina, geo ve sensör topolojisini yükler. +- FLAT_AREA içindeki DS18B20 sensörlerini daire/oda bazında yönetir. +- Bina ortalama sıcaklık istatistiklerini üretir. +- Brülör grupları (BURNER_GROUPS) ve hat sensörleri (dış, çıkış, dönüş) için + başlangıçta okunabilir bir özet verir. +- SeasonController ile mevsim / güneş / tatil bilgisi sağlar. + +Not +--- +Bu modül, hem bağımsız test aracı olarak `python3 -m ebuild.core.building` +şeklinde çalışabilir, hem de BurnerController gibi üst seviye kontrol +modülleri tarafından kullanılabilir. +""" + +import os +import json +import time +import datetime +import statistics +from collections import defaultdict +from typing import Dict, List, Optional, Any + +from .season import SeasonController +from ..io.dbtext import DBText +from .. import config_statics as cfg_s +from .. import config_runtime as cfg_v + + +# ------------------------------------------------------------------ +# Yardımcı sabitler +# ------------------------------------------------------------------ +FlatDirection = { + 0: "Kuzey-Kuzey", + 1: "Kuzey-Doğu", + 2: "Kuzey-Batı", + 3: "Güney-Güney", + 4: "Güney-Doğu", + 5: "Güney-Batı", + 6: "Doğu-Doğu", + 7: "Batı-Batı", +} + +ValveType = { + 0: "Yok", + 1: "Dijital", + 2: "PWM", + 3: "Analog", + 4: "Enkoder", + 5: "Modbus", + 6: "CANbus", +} + + +# ------------------------------------------------------------------ +# DS18B20 sensör sınıfı +# ------------------------------------------------------------------ +class EDSensor: + """Tek bir DS18B20 sensörünü temsil eder.""" + + def __init__(self, serial: str, flat_no: int, flat_direction: int, floor: int, room_no: int = 0) -> None: + self.serial = serial + self.flat_no = flat_no + self.floor = floor + self.room_no = room_no + self.flat_direction = flat_direction + self.device_path = f"/sys/bus/w1/devices/{serial}/w1_slave" + self.flat_check = 0 + self.is_connected = True + + def read_temperature(self) -> Optional[float]: + try: + with open(self.device_path, "r") as f: + lines = f.readlines() + if lines[0].strip().endswith("YES"): + pos = lines[1].find("t=") + if pos != -1: + raw = lines[1][pos + 2 :] + t_c = float(raw) / 1000.0 + self.is_connected = True + return t_c + except Exception: + self.flat_check += 1 + self.is_connected = False + return None + + +# ------------------------------------------------------------------ +# Daire nesnesi +# ------------------------------------------------------------------ +class Flat: + """Daire nesnesi: yön, kat ve sensör ilişkisi.""" + + def __init__(self, flat_no: int, flat_direction: int, sensor: EDSensor, floor: int, room_no: int = 0) -> None: + self.flat_no = flat_no + self.flat_direction = flat_direction + self.sensor = sensor + self.floor = floor + self.room_no = room_no + self.last_heat: Optional[float] = None + self.last_read_time: Optional[datetime.datetime] = None + + +# ------------------------------------------------------------------ +# Bina sınıfı +# ------------------------------------------------------------------ +class Building: + """ + Bina seviyesi sürücü. + + config_statics üzerinden: + + BUILDING_NAME + BUILDING_LOCATION + BUILDING_LABEL + + GEO_CITY + GEO_COUNTRY + GEO_TZ + GEO_LAT + GEO_LON + + FLAT_AREA + BURNER_GROUPS + OUTSIDE_SENSOR_ID / NAME + BURNER_OUT_SENSOR_ID / NAME + RETURN_LINE_SENSOR_IDS / NAME_MAP + """ + + def __init__( + self, + name: Optional[str] = None, + location: Optional[str] = None, + bina_adi: Optional[str] = None, + logtime: bool = False, + logger: Optional[DBText] = None, + ) -> None: + # Bina bilgileri config_statics'ten + self.name = name or getattr(cfg_s, "BUILDING_NAME", "Bina") + self.location = location or getattr(cfg_s, "BUILDING_LOCATION", "Ankara") + self.bina_adi = bina_adi or getattr(cfg_s, "BUILDING_LABEL", "A_Binasi") + + # Coğrafi bilgiler + self.geo_city = getattr(cfg_s, "GEO_CITY", "Ankara") + self.geo_country = getattr(cfg_s, "GEO_COUNTRY", "Turkey") + self.geo_tz = getattr(cfg_s, "GEO_TZ", "Europe/Istanbul") + self.geo_lat = float(getattr(cfg_s, "GEO_LAT", 39.92077)) + self.geo_lon = float(getattr(cfg_s, "GEO_LON", 32.85411)) + + # Logger + self.logger = logger or DBText( + filename=getattr(cfg_s, "BUILDING_LOG_FILE", "ebina_log.sql"), + table=getattr(cfg_s, "BUILDING_LOG_TABLE", "ebrulor_log"), + app="ESYSTEM", + ) + + # Çalışma aralığı: 3 dakika (eski koddaki gibi) + interval_min = getattr(cfg_v, "BUILDING_SAMPLE_MINUTES", 3) + self.interval = datetime.timedelta(seconds=60 * interval_min) + self.next_run = datetime.datetime.now() + + self.flats: Dict[int, Flat] = {} + self.last_max_floor: Optional[int] = None + self.logtime = logtime + + # Season / tatil bilgisi + try: + self.season = SeasonController.from_now() + except Exception as e: + print(f"⚠️ SeasonController.from_now() hata: {e}") + self.season = None + + # Daireleri FLAT_AREA'dan oluştur + self._load_statics_from_flat_area() + + # Bina genel istatistiği (ilk deneme) + try: + self.get_building_temperature_stats() + except Exception: + pass + + # Konsol özet + self._print_header() + self._print_sun_and_season() + self._print_burner_topology() + self._print_line_sensors() + self.print_config() + + def get_hat_sensor_by_id(self, sensor_id: str): + """ + Verilen DS18B20 ID'sine göre hat sensör nesnesini döndür. + Yoksa None döndür. + """ + return self.hat_sensors.get(sensor_id) # yapıya göre uyarlarsın + + # ------------------------------------------------------------------ + # Statik konfigürasyondan daire/sensör yükleme + # ------------------------------------------------------------------ + def _load_statics_from_flat_area(self) -> None: + """config_statics.FLAT_AREA içinden daire/sensörleri yükler.""" + self.flats = {} + flat_area = getattr(cfg_s, "FLAT_AREA", []) + for item in flat_area: + serial = item.get("serial") + flat_no = int(item.get("flat_no", 0)) + room_no = int(item.get("room_no", 0)) + floor = int(item.get("floor", 0)) + direction = int(item.get("direction", 0)) + if not serial: + continue + sensor = EDSensor(serial, flat_no, direction, floor, room_no=room_no) + # bağlantı testi + sensor.read_temperature() + flat = Flat(flat_no, direction, sensor, floor, room_no=room_no) + self.flats[flat_no] = flat + + print("✅ Building: statics yüklendi") + + # ------------------------------------------------------------------ + # Başlangıç çıktıları + # ------------------------------------------------------------------ + def _print_header(self) -> None: + print(f"🏢 Bina adı : {self.bina_adi}") + print(f"📍 Konum : {self.name} / {self.location}") + print( + f"🌍 Geo : {self.geo_city}, {self.geo_country} " + f"({self.geo_lat}, {self.geo_lon}) tz={self.geo_tz}" + ) + print(f"🏠 Daire/oda sayısı: {len(self.flats)}\n") + + def _print_sun_and_season(self) -> None: + """SeasonController üzerinden sunrise / sunset ve mevsim / tatil bilgisini yazar.""" + if not self.season or not getattr(self.season, "info", None): + print("☀️ Sunrise/Sunset : --:-- / --:--") + print("🧭 Mevsim / Tatil : (bilgi yok)\n") + return + + info = self.season.info + sunrise = info.sunrise.strftime("%H:%M") if info.sunrise else "--:--" + sunset = info.sunset.strftime("%H:%M") if info.sunset else "--:--" + + print(f"☀️ Sunrise/Sunset : {sunrise} / {sunset}") + if info.season_start and info.season_end: + print( + f"🧭 Mevsim / Tatil : {info.season} " + f"({info.season_start} → {info.season_end}), " + f"Tatil={info.is_holiday} {info.holiday_label}" + ) + else: + print( + f"🧭 Mevsim / Tatil : {info.season}, " + f"Tatil={info.is_holiday} {info.holiday_label}" + ) + print() + + def _print_burner_topology(self) -> None: + """config_statics.BURNER_GROUPS bilgisini okunaklı yazar.""" + groups = getattr(cfg_s, "BURNER_GROUPS", {}) + if not groups: + print("🔥 Brülör topolojisi: tanımlı değil (BURNER_GROUPS boş).\n") + return + + print("🔥 Brülör Topolojisi (config_statics.BURNER_GROUPS):") + for bid, info in groups.items(): + name = info.get("name", f"Burner{bid}") + loc = info.get("location", "-") + ign = info.get("igniter_pin", None) + print(f" #{bid}: {name} @ {loc}") + print(f" Igniter pin : {ign}") + circ = info.get("circulation", {}) + if not circ: + print(" Pompalar : (tanımlı değil)") + else: + print(" Pompalar :") + for cname, cinfo in circ.items(): + pin = cinfo.get("pin") + default = cinfo.get("default", 0) + print(f" - {cname:<7} → pin={pin:<3} default={default}") + print() + + # ------------------------------------------------------------------ + # Hat sensörleri: dış / çıkış / dönüş + # ------------------------------------------------------------------ + def _read_ds18b20_raw(self, serial: str) -> Optional[float]: + """Seri numarası verilen DS18B20'den tek seferlik okuma.""" + path = f"/sys/bus/w1/devices/{serial}/w1_slave" + try: + with open(path, "r") as f: + lines = f.readlines() + if not lines or not lines[0].strip().endswith("YES"): + return None + pos = lines[1].find("t=") + if pos == -1: + return None + raw = lines[1][pos + 2 :] + return float(raw) / 1000.0 + except Exception: + return None + + def _print_line_sensors(self) -> None: + """ + Dış ısı, kazan çıkış ısısı ve dönüş hat sensörlerini (varsa) ekrana yazar. + config_statics içindeki: + OUTSIDE_SENSOR_ID / OUTSIDE_SENSOR_NAME + BURNER_OUT_SENSOR_ID / BURNER_OUT_SENSOR_NAME + RETURN_LINE_SENSOR_IDS + RETURN_LINE_SENSOR_NAME_MAP + kullanılır. + """ + outside_id = getattr(cfg_s, "OUTSIDE_SENSOR_ID", None) + outside_nm = getattr(cfg_s, "OUTSIDE_SENSOR_NAME", "Dış Isı 1") + burner_id = getattr(cfg_s, "BURNER_OUT_SENSOR_ID", None) + burner_nm = getattr(cfg_s, "BURNER_OUT_SENSOR_NAME", "Çıkış Isı 1") + return_ids = list(getattr(cfg_s, "RETURN_LINE_SENSOR_IDS", [])) + name_map = dict(getattr(cfg_s, "RETURN_LINE_SENSOR_NAME_MAP", {})) + + if not (outside_id or burner_id or return_ids): + # Hiç tanım yoksa sessizce geç + return + + print("🌡️ Hat sensörleri:") + # Dış ısı + if outside_id: + t = self._read_ds18b20_raw(outside_id) + if t is None: + print(f" - {outside_nm:<15}: ❌ Okunamadı ({outside_id})") + else: + print(f" - {outside_nm:<15}: {t:5.2f}°C ({outside_id})") + + # Kazan çıkış + if burner_id: + t = self._read_ds18b20_raw(burner_id) + if t is None: + print(f" - {burner_nm:<15}: ❌ Okunamadı ({burner_id})") + else: + print(f" - {burner_nm:<15}: {t:5.2f}°C ({burner_id})") + + # Dönüş hatları + for sid in return_ids: + nm = name_map.get(sid, sid) + t = self._read_ds18b20_raw(sid) + if t is None: + print(f" - Dönüş {nm:<10}: ❌ Okunamadı ({sid})") + else: + print(f" - Dönüş {nm:<10}: {t:5.2f}°C ({sid})") + print() + + # ------------------------------------------------------------------ + # İstatistik fonksiyonları + # ------------------------------------------------------------------ + def _summarize(self, values: List[float]) -> dict: + if not values: + return {"min": None, "max": None, "avg": None, "count": 0} + return { + "min": min(values), + "max": max(values), + "avg": round(statistics.mean(values), 2), + "count": len(values), + } + + def get_temperature_stats(self) -> str: + stats = { + "floors": defaultdict(list), + "directions": defaultdict(list), + "top_floor": [], + "building": [], + } + + max_floor = self.last_max_floor + + for flat in self.flats.values(): + temp = flat.sensor.read_temperature() + if temp is not None: + flat.last_heat = temp + flat.last_read_time = datetime.datetime.now() + stats["floors"][flat.floor].append(temp) + stats["directions"][flat.flat_direction].append(temp) + stats["building"].append(temp) + if max_floor is not None and flat.floor == max_floor: + stats["top_floor"].append(temp) + + result = { + "floors": {f: self._summarize(v) for f, v in stats["floors"].items()}, + "directions": { + d: self._summarize(v) for d, v in stats["directions"].items() + }, + "top_floor": self._summarize(stats["top_floor"]), + "building": self._summarize(stats["building"]), + } + return json.dumps(result, indent=4, ensure_ascii=False) + + def get_last_heat_report(self) -> str: + report = [] + for flat in self.flats.values(): + temp = flat.sensor.read_temperature() + now = datetime.datetime.now() + if temp is not None: + flat.last_heat = temp + flat.last_read_time = now + report.append( + { + "flat_no": flat.flat_no, + "room_no": flat.room_no, + "direction": flat.flat_direction, + "floor": flat.floor, + "serial": flat.sensor.serial, + "last_heat": flat.last_heat, + "last_read_time": flat.last_read_time.strftime( + "%Y-%m-%d %H:%M:%S" + ) + if flat.last_read_time + else None, + "is_connected": flat.sensor.is_connected, + "flat_check": flat.sensor.flat_check, + } + ) + return json.dumps(report, indent=4, ensure_ascii=False) + + def get_building_temperature_stats(self) -> Optional[dict]: + print("\n🌡️ Bina Genel Isı Bilgisi:") + all_temps: List[float] = [] + floor_temps: Dict[int, List[float]] = {} + now = datetime.datetime.now() + + # Log zamanı mı? + if now >= self.next_run: + self.logtime = True + self.next_run = now + self.interval + else: + self.logtime = False + + self.last_max_floor = None + + for flat in self.flats.values(): + temp = flat.sensor.read_temperature() + floor = flat.floor + + if temp is not None: + flat.last_heat = temp + flat.last_read_time = now + if self.last_max_floor is None or floor > self.last_max_floor: + self.last_max_floor = floor + else: + flat.last_heat = None + flat.last_read_time = None + + floor_temps.setdefault(floor, []) + if temp is not None: + all_temps.append(temp) + floor_temps[floor].append(temp) + if self.logtime: + self.logger.insert_event( + source=f"Sensor:{flat.sensor.serial}", + event_type="temperature", + value=temp, + unit="°C", + timestamp=now, + extra=f"Daire {flat.flat_no} Oda {flat.room_no} Kat {flat.floor}, Yön {flat.flat_direction}", + ) + + if not all_temps or not floor_temps: + print("❌ Hiç sıcaklık verisi alınamadı.\n") + return None + + min_temp = min(all_temps) + max_temp = max(all_temps) + avg_temp = sum(all_temps) / len(all_temps) + + min_floor = min(floor_temps.keys()) + max_floor = max(floor_temps.keys()) + + avg_min_floor = sum(floor_temps[min_floor]) / max(len(floor_temps[min_floor]), 1) + avg_max_floor = sum(floor_temps[max_floor]) / max(len(floor_temps[max_floor]), 1) + delta_t = abs(avg_max_floor - avg_min_floor) + + print( + " Min: {:.2f}°C | Max: {:.2f}°C | Avg: {:.2f}°C | Count: {}".format( + min_temp, max_temp, avg_temp, len(all_temps) + ) + ) + print(f" En Alt Kat ({min_floor}): {avg_min_floor:.2f}°C") + print(f" En Üst Kat ({max_floor}): {avg_max_floor:.2f}°C") + print(f" 🔺 Delta Isı (Üst - Alt): {delta_t:.2f}°C") + + if self.logtime: + self.logger.insert_event( + source="Sensor:min", + event_type="temperature", + value=min_temp, + unit="°C", + timestamp=now, + extra="", + ) + self.logger.insert_event( + source="Sensor:max", + event_type="temperature", + value=max_temp, + unit="°C", + timestamp=now, + extra="", + ) + self.logger.insert_event( + source="Sensor:avg", + event_type="temperature", + value=avg_temp, + unit="°C", + timestamp=now, + extra="", + ) + + return { + "min": min_temp, + "max": max_temp, + "avg": avg_temp, + "count": len(all_temps), + "min_floor": min_floor, + "max_floor": max_floor, + "avg_min_floor": avg_min_floor, + "avg_max_floor": avg_max_floor, + "delta_t": delta_t, + } + + # ------------------------------------------------------------------ + # Yardımcı + # ------------------------------------------------------------------ + def print_config(self) -> None: + if not self.flats: + print(f"📦 {self.bina_adi} için tanımlı daire yok.") + return + + print(f"\n📦 {self.bina_adi} içeriği:") + for flat_no, flat in self.flats.items(): + temp = flat.sensor.read_temperature() + durum = "✅ Bağlı" if temp is not None else "❌ Yok" + print( + " Daire {:<3} Oda {:<1} | Kat: {:<2} | Yön: {:<12} | Sensör: {:<18} | Durum: {} | AKTIF".format( + flat.flat_no, + flat.room_no, + flat.floor, + FlatDirection.get(flat.flat_direction, "Bilinmiyor"), + flat.sensor.serial, + durum, + ) + ) + + def run_forever(self, sleep_s: int = 5) -> None: + """Eski test aracı gibi: sürekli bina istatistiği üretir.""" + while True: + self.get_building_temperature_stats() + time.sleep(sleep_s) + + +# ---------------------------------------------------------------------- +# CLI +# ---------------------------------------------------------------------- +if __name__ == "__main__": + bina = Building() # Config'ten her şeyi alır + bina.run_forever() diff --git a/ebuild/core/devices.py b/ebuild/core/devices.py new file mode 100644 index 0000000..2c961e9 --- /dev/null +++ b/ebuild/core/devices.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Device / Sensor / Actuator soyutlamaları için iskelet.""" diff --git a/ebuild/core/environment.py b/ebuild/core/environment.py new file mode 100644 index 0000000..b11a6a2 --- /dev/null +++ b/ebuild/core/environment.py @@ -0,0 +1,306 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "environment" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina dış ortam sıcaklığı (DS18B20) ve analog sensörler için ortam merkezi" +__version__ = "0.3.0" +__date__ = "2025-11-23" + +""" +ebuild/core/environment.py + +Amaç +----- +- Bina dış ortam sıcaklığı (DS18B20) ve MCP3008 üzerinden okunan analog sensörleri + tek bir merkezde toplamak. +- Üst seviye modüller (ör: BurnerController, sulama sistemi, alarm sistemi) bu + sınıf üzerinden dış ortam ve analog bilgilerine erişir. + +Notlar +------ +- Bu katman donanım erişimini kapsüller: + * io/ds18b20.py + * io/adc_mcp3008.py + * core/analog_sensors.py +""" + +from typing import Dict, Optional, Any +import datetime + +# Donanım bağımlı modüller +try: + from ..io.ds18b20 import DS18B20Sensor +except ImportError: + print("from ..io.ds18b20 import DS18B20Sensor NOT IMPORTED") + DS18B20Sensor = None # type: ignore + +try: + from ..io.adc_mcp3008 import MCP3008ADC +except ImportError: + print("from ..io.adc_mcp3008 import MCP3008ADC NOT IMPORTED") + MCP3008ADC = None # type: ignore + +try: + from .analog_sensors import AnalogSensorsHub +except ImportError: + print("from .analog_sensors import AnalogSensorsHub NOT IMPORTED") + AnalogSensorsHub = None # type: ignore + +# Config HER ZAMAN ayrı import edilmeli, donanıma bağlı değil +try: + from .. import config_statics as cfgs +except ImportError as e: + print("ENV: config_statics import edilemedi:", e) + cfgs = None # type: ignore + + +class BuildingEnvironment: + """ + Bina çevre sensörlerini yöneten merkez. + + Özellikler: + ----------- + - outside : DS18B20 dış ortam sensörü (OUTSIDE_SENSOR_ID üzerinden) + - adc : MCP3008ADC örneği + - analog : AnalogSensorsHub (basınç, gaz, yağmur, LDR) + """ + + def __init__( + self, + name: str = "BuildingEnvironment", + outside_sensor_id: Optional[str] = None, + use_outside_ds18: bool = True, + use_adc: bool = True, + ) -> None: + #print("BuildingEnvironment Init:", name, outside_sensor_id, use_outside_ds18, use_adc) + self.name = name + + # ------------------------------------------------------------------ + # Dış ortam sıcaklığı (DS18B20) + # ------------------------------------------------------------------ + + # 1) Önce parametreden gelen ID; yoksa config_statics.OUTSIDE_SENSOR_ID + if not outside_sensor_id and cfgs is not None: + try: + outside_sensor_id = getattr(cfgs, "OUTSIDE_SENSOR_ID", None) + except Exception as e: + print("BuildingEnvironment: outside sensör ID okunamadı:", e) + outside_sensor_id = None + + #print( "BuildingEnvironment get outside_sensor_id:", outside_sensor_id, "use_outside_ds18", use_outside_ds18, "use_adc", use_adc ) + + # 2) self.outside_id ve self.outside MUTLAKA burada tanımlanmalı + self.outside_id: str = outside_sensor_id or "" + self.outside: Optional[DS18B20Sensor] = None # type: ignore + + #print("DS18B20Sensor", type(DS18B20Sensor), DS18B20Sensor) + + # 3) ID makulse DS18 sensörünü yarat + if use_outside_ds18 and DS18B20Sensor is not None and len(self.outside_id) > 5: + try: + #print("BuildingEnvironment: DS18B20Sensor yaratılıyor, id =", self.outside_id) + self.outside = DS18B20Sensor(serial=self.outside_id, name="OutsideTemp") + #print("BuildingEnvironment: self.outside:", self.outside) + except Exception as e: + print("BuildingEnvironment: outside sensör oluşturulamadı:", e) + self.outside = None + else: + print( + "BuildingEnvironment: dış sensör yok veya devre dışı:", + "use_outside_ds18 =", use_outside_ds18, + "DS18B20Sensor is None =", DS18B20Sensor is None, + "outside_id =", repr(self.outside_id), + ) + + #print("BuildingEnvironment 5:", name, self.outside, outside_sensor_id, use_outside_ds18, use_adc) + # Dış ısı cache'i (kontrol katmanları için) + self._last_outside_temp_c: Optional[float] = None + self._last_outside_read_ts: Optional[datetime.datetime] = None + + # ------------------------------------------------------------------ + # MCP3008 ve analog sensör hub + # ------------------------------------------------------------------ + self.adc: Optional[MCP3008ADC] = None # type: ignore + self.analog: Optional[AnalogSensorsHub] = None # type: ignore + + if use_adc and MCP3008ADC is not None and AnalogSensorsHub is not None: + try: + self.adc = MCP3008ADC() + self.analog = AnalogSensorsHub(self.adc) + except Exception: + self.adc = None + self.analog = None + + # ---------------------------------------------------------------------- + # Okuma fonksiyonları + # ---------------------------------------------------------------------- + def read_outside_temp(self) -> Dict[str, Optional[float]]: + """ + DS18B20 dış ortam sensöründen sıcaklık okur. + + Dönüş: + {"outside_temp_c": 23.4, "read_ts": datetime} # veya None + """ + temp: Optional[float] = None + now = datetime.datetime.now() + + if self.outside is not None: + try: + temp = self.outside.read_temperature() + except Exception: + temp = None + + if temp is not None: + self._last_outside_temp_c = temp + self._last_outside_read_ts = now + + return { + "outside_temp_c": temp, + "read_ts": now, + } + + def get_outside_temp_cached(self, max_age_sec: int = 60) -> Optional[float]: + """ + Dış ortam sıcaklığını cache üzerinden döndürür; gerekirse sensörden günceller. + + - Eğer hiç okunmamışsa → sensörden okur. + - Eğer son okuma max_age_sec saniyeden eskiyse → yeniden okur. + """ + now = datetime.datetime.now() + + if ( + self._last_outside_read_ts is None + or (now - self._last_outside_read_ts).total_seconds() > max_age_sec + ): + snap = self.read_outside_temp() + temp = snap.get("outside_temp_c") + if temp is not None: + self._last_outside_temp_c = temp + self._last_outside_read_ts = now + + return self._last_outside_temp_c + + def read_analog_all(self) -> Dict[str, Any]: + """ + AnalogSensorsHub üzerinden tüm analog kanalları okur. + + Dönüş sözlüğü: + { + "pressure_raw": ..., + "pressure_state": ..., + "gas_raw": ..., + "gas_state": ..., + "gas_latched_alarm": ..., + "rain_raw": ..., + "rain_state": ..., + "ldr_raw": ..., + "ldr_state": ..., + } + """ + data: Dict[str, Any] = { + "pressure_raw": None, + "pressure_state": None, + "gas_raw": None, + "gas_state": None, + "gas_latched_alarm": None, + "rain_raw": None, + "rain_state": None, + "ldr_raw": None, + "ldr_state": None, + } + + if self.analog is None: + return data + + values = self.analog.update_all() + + # Basınç + data["pressure_raw"] = values.get("pressure") + data["pressure_state"] = getattr(self.analog.pressure, "state", None) + + # Gaz + data["gas_raw"] = values.get("gas") + data["gas_state"] = getattr(self.analog.gas, "state", None) + data["gas_latched_alarm"] = getattr(self.analog.gas, "latched_alarm", None) + + # Yağmur + data["rain_raw"] = values.get("rain") + data["rain_state"] = getattr(self.analog.rain, "state", None) + + # LDR + data["ldr_raw"] = values.get("ldr") + data["ldr_state"] = getattr(self.analog.ldr, "state", None) + + return data + + # ---------------------------------------------------------------------- + # Yüksek seviye snapshot + # ---------------------------------------------------------------------- + def get_snapshot(self) -> Dict[str, Any]: + """ + Dış sıcaklık (DS18B20) + tüm analog sensörler için tek sözlük döndürür. + + Örnek: + { + "outside_temp_c": 14.3, + "pressure_raw": 512, + "pressure_state": "SAFE", + "gas_raw": 80, + "gas_state": "SAFE", + "gas_latched_alarm": False, + "rain_raw": 100, + "rain_state": "DRY", + "ldr_raw": 900, + "ldr_state": "BRIGHT", + } + """ + snap: Dict[str, Any] = {} + snap.update(self.read_outside_temp()) + snap.update(self.read_analog_all()) + return snap + + # ---------------------------------------------------------------------- + # Güvenlik yardımcıları + # ---------------------------------------------------------------------- + def should_shutdown_system(self) -> bool: + """ + Analog sensör verilerine göre sistem acil kapatılmalı mı? + + Örn: + - Gaz sızıntısı + - Aşırı basınç + vs. + + Şu an sadece gaz latched_alarm'a bakıyor. + """ + if self.analog is None: + return False + + if getattr(self.analog.gas, "latched_alarm", False): + return True + + return False + + # ---------------------------------------------------------------------- + # Temel temsil + # ---------------------------------------------------------------------- + def summary(self) -> str: + """ + Ortamın kısa özetini döndürür. + """ + parts = [f"env_name={self.name}"] + parts.append(f"outside_id={self.outside_id!r}") + parts.append(f"outside={'OK' if self.outside is not None else 'NONE'}") + parts.append(f"adc={'OK' if self.adc is not None else 'NONE'}") + parts.append(f"analog={'OK' if self.analog is not None else 'NONE'}") + return "BuildingEnvironment(" + ", ".join(parts) + ")" + + +if __name__ == "__main__": + # Basit demo + env = BuildingEnvironment() + print(env.summary()) + snap = env.get_snapshot() + print("Snapshot:", snap) + print("Gaz shutdown mu?:", env.should_shutdown_system()) diff --git a/ebuild/core/season.py b/ebuild/core/season.py new file mode 100644 index 0000000..4a85baa --- /dev/null +++ b/ebuild/core/season.py @@ -0,0 +1,395 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "season" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Güneş / tatil / mevsim + tasarruf sezonu bilgisini sağlayan yardımcı katman" +__version__ = "0.3.1" +__date__ = "2025-11-23" + +""" +ebuild/core/season.py + +Amaç +----- +- SunHolidayInfo kullanarak: + * gün doğumu / batımı / öğlen + * resmi tatil bilgisi + * mevsim ve sezon süresi + * tasarruf sezonu (saving) başlangıç/bitiş + bilgilerini üretir. + +- Bu bilgiyi BurnerController ve legacy_syslog gibi modüllere + SeasonController.info üzerinden sağlar. + +Not: +- SunHolidayInfo import edilemez veya hata verirse, basit bir + fallback mevsim + tasarruf sezonu bilgisi üretir. +""" + +from dataclasses import dataclass +from datetime import datetime, time, date, timedelta +from typing import Optional, Tuple, Any + +from .. import config_statics as cfg_s + +# SunHolidayInfo'yu paket içinden al; yoksa fallback'e düş +try: + from .sunholiday import SunHolidayInfo # type: ignore +except Exception: + SunHolidayInfo = None # type: ignore + +# Tasarruf sezonu parametreleri için runtime config +try: + from .. import config_runtime as cfg_v # type: ignore +except Exception: + cfg_v = None # type: ignore + + +# --------------------------------------------------------------------- +# Veri yapısı +# --------------------------------------------------------------------- +@dataclass +class SeasonInfo: + """SeasonController tarafından sağlanan özet bilgi.""" + date: date + + sunrise: Optional[time] + sunset: Optional[time] + noon: Optional[time] + + is_holiday: bool + holiday_label: str + + season: str # "İlkbahar", "Yaz", "Sonbahar", "Kış", ... + season_start: str # "YYYY-MM-DD" + season_end: str # "YYYY-MM-DD" + season_day: int # sezonun toplam gün sayısı + season_passed: int # sezon içinde geçen gün + season_remaining: int # sezon sonuna kalan gün + + # Tasarruf sezonu (saving) bilgileri + is_season: bool = False # BUGÜN tasarruf sezonu içinde miyiz? + saving_start: Optional[date] = None # tasarruf dönemi başlangıç tarihi + saving_stop: Optional[date] = None # tasarruf dönemi bitiş tarihi + + +# --------------------------------------------------------------------- +# Yardımcı fonksiyonlar +# --------------------------------------------------------------------- +def _parse_time_str(s: Optional[str]) -> Optional[time]: + if not s: + return None + for fmt in ("%H:%M:%S", "%H:%M"): + try: + return datetime.strptime(s, fmt).time() + except Exception: + continue + return None + + +def _parse_date_any(v: Any) -> Optional[date]: + """ + v: datetime / date / str / None → date veya None. + """ + if v is None: + return None + if isinstance(v, date) and not isinstance(v, datetime): + return v + if isinstance(v, datetime): + return v.date() + if isinstance(v, str): + s = v.strip() + # "2025-09-23T22:42:51.508546+03:00" => "2025-09-23" + if "T" in s: + s = s.split("T", 1)[0] + # ISO parse dene + try: + return datetime.fromisoformat(s).date() + except Exception: + pass + # Son çare saf "YYYY-MM-DD" + try: + return datetime.strptime(s, "%Y-%m-%d").date() + except Exception: + return None + return None + + +def _as_int(x: Any, default: int = 0) -> int: + try: + return int(x) + except Exception: + return default + + +def _get_saving_param_for_season(season_name: str) -> Optional[Any]: + """ + Sezona göre ilgili tasarruf parametresini getirir. + + - İlkbahar → cfg_v.SEASON_SPRING_SAVE_DAYS + - Sonbahar → cfg_v.SEASON_AUTUMN_SAVE_DAYS + + Yoksa None döner. + """ + if cfg_v is None: + return None + + if season_name == "İlkbahar": + return getattr(cfg_v, "SEASON_SPRING_SAVE_DAYS", None) + if season_name == "Sonbahar": + return getattr(cfg_v, "SEASON_AUTUMN_SAVE_DAYS", None) + return None + +def tarih_gun_islemi(tarih_str, gun_sayisi): + try: + tarih = datetime.strptime(tarih_str, "%Y-%m-%d") + yeni_tarih = tarih + timedelta(days=gun_sayisi) + return yeni_tarih.strftime("%Y-%m-%d") + except ValueError: + return "Hata: Tarih formatı yanlış olmalı! Örnek: '2025-06-30'" + + +def _compute_saving_window( + season_name: str, + season_start: Optional[date], + season_end: Optional[date], + today: date, +) -> Tuple[bool, Optional[date], Optional[date]]: + """ + Tasarruf sezonu penceresini hesaplar. + + Buradaki tanım: + - SEASON_SPRING_SAVE_DAYS -> Nisan ayı için gün aralığı (nisan) + - SEASON_AUTUMN_SAVE_DAYS -> Eylül ayı için gün aralığı (eylül) + + Örnek: + SEASON_SPRING_SAVE_DAYS = (5, 20) -> 5-20 Nisan arası tasarruf + SEASON_AUTUMN_SAVE_DAYS = (15, 30) -> 15-30 Eylül arası tasarruf + + Mantık: + - Eğer bugün ay < 6 (Haziran'dan önce) ise -> Nisan aralığını kullan + - Eğer bugün ay >= 6 ise -> Eylül aralığını kullan + + Dönüş: + (is_season, saving_start, saving_stop) + """ + if season_start is None or season_end is None or cfg_v is None: + return False, None, None + + # Bugünün tarihi (sadece date, saat yok) + today = date.today() + year = today.year + + # Config'den değerleri güvenli şekilde al (varsayılan değerle) + SPRING_SAVE_DAYS = getattr(cfg_v, "SEASON_SPRING_SAVE_DAYS", 20) # örnek: 20 + AUTUMN_SAVE_DAYS = getattr(cfg_v, "SEASON_AUTUMN_SAVE_DAYS", 13) # örnek: 13 + + # İlkbahar mı yoksa Sonbahar mı dönemi aktif? + if today.month <= 5: # Ocak-Mayıs arası → ilkbahar dönemi aktif + # İlkbaharın son gününden geriye doğru + saving_stop = date(year, 5, 31) # 31 Mayıs (dahil) + saving_start = saving_stop - timedelta(days=SPRING_SAVE_DAYS - 1) # dahil olduğu için -1 + + else: # Haziran-Aralık arası → sonbahar dönemi aktif + # Sonbaharın ilk gününden ileri doğru + saving_start = date(year, 9, 1) # 1 Eylül (dahil) + saving_stop = saving_start + timedelta(days=AUTUMN_SAVE_DAYS - 1) # dahil olduğu için -1 + + # Sezon içinde miyiz? + is_season = saving_start <= today <= saving_stop + return is_season, saving_start, saving_stop + + +# --------------------------------------------------------------------- +# Ana controller +# --------------------------------------------------------------------- +class SeasonController: + """ + Tek sorumluluğu: o anki (veya verilen tarihteki) güneş / tatil / + mevsim + tasarruf sezonu bilgisini üst katmanlara taşımak. + """ + + def __init__(self, info: SeasonInfo) -> None: + self.info = info + + # --------------------------------------------------------- + # Factory metodları + # --------------------------------------------------------- + @classmethod + def from_now(cls) -> "SeasonController": + """ + Sistem saatine göre SeasonController üretir. + GEO_* bilgilerini config_statics'ten alır. + """ + now = datetime.now() + return cls(cls._build_info(now)) + + @classmethod + def from_datetime(cls, dt: datetime) -> "SeasonController": + return cls(cls._build_info(dt)) + + # --------------------------------------------------------- + # İç mantık + # --------------------------------------------------------- + @classmethod + def _build_info(cls, now: datetime) -> SeasonInfo: + """ + SunHolidayInfo varsa onu kullanır; yoksa basit bir fallback + sezon + tasarruf sezonu bilgisi üretir. + """ + geo_city = getattr(cfg_s, "GEO_CITY", "Ankara") + geo_country = getattr(cfg_s, "GEO_COUNTRY", "Turkey") + geo_tz = getattr(cfg_s, "GEO_TZ", "Europe/Istanbul") + geo_lat = float(getattr(cfg_s, "GEO_LAT", 39.92077)) + geo_lon = float(getattr(cfg_s, "GEO_LON", 32.85411)) + + today = now.date() + + # ------------------------------ + # 1) SunHolidayInfo kullanmayı dene + # ------------------------------ + if SunHolidayInfo is not None: + try: + tracker = SunHolidayInfo( + current_datetime=now, + city_name=geo_city, + country=geo_country, + timezone=geo_tz, + latitude=geo_lat, + longitude=geo_lon, + ) + data = tracker.get_info() + + sunrise_t = _parse_time_str(data.get("sunrise")) + sunset_t = _parse_time_str(data.get("sunset")) + noon_t = _parse_time_str(data.get("noon")) + + season_name = data.get("season") or "Bilinmiyor" + ss_raw = data.get("season_start") or "" + se_raw = data.get("season_end") or "" + + ds = _parse_date_any(ss_raw) + de = _parse_date_any(se_raw) + + if ds is None: + ds = today + if de is None or de < ds: + de = ds + + total_days = _as_int(data.get("season_day"), 0) + passed_days = _as_int(data.get("season_passed"), 0) + remaining_days = _as_int(data.get("season_remaining"), 0) + + # Eğer harici toplam/remaining güvenilmezse basit hesap + if total_days <= 0 or remaining_days < 0: + total_days = (de - ds).days + 1 + passed_days = (today - ds).days + remaining_days = (de - today).days + + is_season, saving_start, saving_stop = _compute_saving_window( + season_name, ds, de, today + ) + + return SeasonInfo( + date = today, + sunrise = sunrise_t, + sunset = sunset_t, + noon = noon_t, + is_holiday = bool(data.get("is_holiday", False)), + holiday_label = str(data.get("holiday_label", "")), + season = season_name, + season_start = ds.isoformat(), + season_end = de.isoformat(), + season_day = total_days, + season_passed = passed_days, + season_remaining = remaining_days, + is_season = is_season, + saving_start = saving_start, + saving_stop = saving_stop, + ) + except Exception as e: + print(f"⚠️ SunHolidayInfo hata, fallback kullanılacak: {e}") + + # ------------------------------ + # 2) Fallback: sadece mevsim tahmini + saving + # ------------------------------ + month = now.month + day = now.day + + if (month == 12 and day >= 1) or (1 <= month <= 3 and (month < 3 or day <= 20)): + season_label = "Kış" + ss = f"{now.year}-12-01" + se = f"{now.year+1}-03-20" if month == 12 else f"{now.year}-03-20" + elif 3 <= month <= 6 and not (month == 6 and day > 20): + season_label = "İlkbahar" + ss = f"{now.year}-03-21" + se = f"{now.year}-06-20" + elif 6 <= month <= 9 and not (month == 9 and day > 22): + season_label = "Yaz" + ss = f"{now.year}-06-21" + se = f"{now.year}-09-22" + else: + season_label = "Sonbahar" + ss = f"{now.year}-09-23" + se = f"{now.year}-11-30" + + try: + ds = datetime.fromisoformat(ss).date() + de = datetime.fromisoformat(se).date() + total_days = (de - ds).days + 1 + passed_days = (today - ds).days + remaining_days = (de - today).days + except Exception: + ds = today + de = today + total_days = passed_days = remaining_days = 0 + + is_season, saving_start, saving_stop = _compute_saving_window( + season_label, ds, de, today + ) + + return SeasonInfo( + date = today, + sunrise = None, + sunset = None, + noon = None, + is_holiday = False, + holiday_label = "", + season = season_label, + season_start = ds.isoformat(), + season_end = de.isoformat(), + season_day = total_days, + season_passed = passed_days, + season_remaining = remaining_days, + is_season = is_season, + saving_start = saving_start, + saving_stop = saving_stop, + ) + + # --------------------------------------------------------- + # Legacy / debug uyumlu satırlar + # --------------------------------------------------------- + def to_syslog_lines(self) -> list[str]: + """ + legacy_syslog.emit_header_season veya debug için özet satırlar üretir. + Örnek: + "season : İlkbahar 2025-03-21 - 2025-06-20 day:92 passed:10 remaining:82" + "saving : True 2025-03-21 - 2025-04-10" + """ + i = self.info + lines: list[str] = [] + + lines.append( + f"season : {i.season} {i.season_start} - {i.season_end} " + f"day:{i.season_day} passed:{i.season_passed} remaining:{i.season_remaining}" + ) + + if i.saving_start and i.saving_stop: + lines.append( + f"saving : {i.is_season} {i.saving_start.isoformat()} - {i.saving_stop.isoformat()}" + ) + else: + lines.append("saving : False - -") + + return lines diff --git a/ebuild/core/sunholiday.py b/ebuild/core/sunholiday.py new file mode 100644 index 0000000..37c1220 --- /dev/null +++ b/ebuild/core/sunholiday.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "sunholiday" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Astral ve eholidays_tr kullanarak güneş / tatil / mevsim bilgisi üretir" +__version__ = "0.1.1" +__date__ = "2025-11-22" + +""" +ebuild/core/sunholiday.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +Eski sistemde kullandığın SunHolidayInfo sınıfını, ebuild projesi +için bağımsız bir modüle taşıdık. Bu modül: + + - Astral ile gün doğumu / gün batımı / öğlen + - eholidays_tr ile resmi tatil (yoksa graceful fallback) + - Basit mevsim hesabı + +bilgilerini üretir ve SeasonController tarafından kullanılır. + +Dış arayüz: + class SunHolidayInfo: + - get_info() -> dict + - print_info() + - to_json() +""" + +import json +from datetime import datetime +from enum import Enum + +from astral import LocationInfo +from astral.sun import sun +import pytz + +# eholidays_tr yoksa sistem göçmesin → dummy tracker +try: + from eholidays_tr import HolidayTracker # type: ignore +except Exception: + class HolidayTracker: # type: ignore + def __init__(self, year: int) -> None: + self.year = year + def is_holiday(self, dt) -> None: + return None + + +class Season(Enum): + KIS = "Kış" + ILKBAHAR = "İlkbahar" + YAZ = "Yaz" + SONBAHAR = "Sonbahar" + + +class SunHolidayInfo: + """ + Astral + eholidays_tr kombinasyonu ile gün / tatil / mevsim bilgisi üretir. + """ + + def __init__( + self, + current_datetime=None, + city_name: str = "Ankara", + country: str = "Turkey", + timezone: str = "Europe/Istanbul", + latitude: float = 39.92077, + longitude: float = 32.85411, + ) -> None: + self.city = city_name + self.country = country + self.timezone_str = timezone + self.timezone = pytz.timezone(timezone) + self.lat = latitude + self.lon = longitude + + if current_datetime is None: + self.current_datetime = datetime.now(self.timezone) + else: + # Eğer naive datetime geldiyse timezone ekleyelim + if current_datetime.tzinfo is None: + self.current_datetime = self.timezone.localize(current_datetime) + else: + self.current_datetime = current_datetime.astimezone(self.timezone) + + self.location = LocationInfo( + self.city, self.country, self.timezone_str, self.lat, self.lon + ) + self.work_date = self.current_datetime + + # --------------------------------------------------------- + # Yardımcılar + # --------------------------------------------------------- + def return_init(self) -> str: + return ( + f"SunHolidayInfo: {self.country} {self.city} " + f"{self.timezone_str} {self.lat} - {self.lon}" + ) + + def get_season(self, date_obj: datetime): + """ + Astronomik mevsim aralıklarıyla kaba mevsim ve gün bilgisi üretir. + """ + ranges = { + Season.KIS: [ + (date_obj.replace(month=1, day=1), date_obj.replace(month=3, day=20)), + (date_obj.replace(month=12, day=21), date_obj.replace(month=12, day=31)), + ], + Season.ILKBAHAR: [ + (date_obj.replace(month=3, day=21), date_obj.replace(month=6, day=20)) + ], + Season.YAZ: [ + (date_obj.replace(month=6, day=21), date_obj.replace(month=9, day=22)) + ], + Season.SONBAHAR: [ + (date_obj.replace(month=9, day=23), date_obj.replace(month=12, day=20)) + ], + } + + for season, periods in ranges.items(): + for start, end in periods: + if start <= date_obj <= end: + total_days = (end - start).days + 1 + passed_days = (date_obj - start).days + remaining_days = (end - date_obj).days + return { + "season": season.value, + "season_start": start.isoformat(), + "season_end": end.isoformat(), + "season_day": total_days, + "season_passed": passed_days, + "season_remaining": remaining_days, + } + + return None + + # --------------------------------------------------------- + # Ana API + # --------------------------------------------------------- + def get_info(self) -> dict: + """ + Astral + HolidayTracker + mevsim hesabını bir dict olarak döner. + """ + sun_data = sun( + self.location.observer, + date=self.work_date, + tzinfo=self.timezone, + ) + + tracker = HolidayTracker(self.work_date.year) + holiday_label = tracker.is_holiday(self.work_date) + + season_info = self.get_season(self.work_date) + + return { + "date": self.work_date.isoformat(), + "sunrise": sun_data["sunrise"].strftime("%H:%M:%S"), + "sunset": sun_data["sunset"].strftime("%H:%M:%S"), + "noon": sun_data["noon"].strftime("%H:%M:%S"), + "is_holiday": bool(holiday_label), + "holiday_label": holiday_label if holiday_label else "Yok", + "season": season_info["season"] if season_info else None, + "season_start": season_info["season_start"] if season_info else None, + "season_end": season_info["season_end"] if season_info else None, + "season_day": season_info["season_day"] if season_info else None, + "season_passed": season_info["season_passed"] if season_info else None, + "season_remaining": season_info["season_remaining"] if season_info else None, + } + + def print_info(self) -> None: + info = self.get_info() + print(f"Güneş bilgileri - {self.location.name}, {info['date']}") + print(f"Doğuş: {info['sunrise']}") + print(f"Batış: {info['sunset']}") + print(f"Öğlen: {info['noon']}") + print(f"Tatil mi?: {'Evet' if info['is_holiday'] else 'Hayır'}") + if info["is_holiday"]: + print(f"Etiket: {info['holiday_label']}") + + def to_json(self) -> str: + return json.dumps(self.get_info(), ensure_ascii=False, indent=2) + + +if __name__ == "__main__": + s = SunHolidayInfo() + print(s.return_init()) + print(s.to_json()) diff --git a/ebuild/core/systems/__init__.py b/ebuild/core/systems/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/ebuild/core/systems/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/ebuild/core/systems/__pycache__/__init__.cpython-39.pyc b/ebuild/core/systems/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ba1b78c6dd29c4270912eb319723c5edd3a641b GIT binary patch literal 143 zcmYe~<>g`kf+%zOObH1DW<2 Gh#3IWfFM`^ literal 0 HcmV?d00001 diff --git a/ebuild/core/systems/__pycache__/burner.cpython-39.pyc b/ebuild/core/systems/__pycache__/burner.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d67ee291017a08f1b2d1763612a770e3a2b89866 GIT binary patch literal 14524 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 literal 0 HcmV?d00001 diff --git a/ebuild/core/systems/burner.py b/ebuild/core/systems/burner.py new file mode 100644 index 0000000..bee797d --- /dev/null +++ b/ebuild/core/systems/burner.py @@ -0,0 +1,679 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "burner" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina ve/veya dış ısıya göre brülör ve sirkülasyon kontrol çekirdeği" +__version__ = "0.4.3" +__date__ = "2025-11-22" + +""" +ebuild/core/systems/burner.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- BUILD_BURNER moduna göre (F/B) brülör ve sirkülasyon pompalarını yönetmek +- Bina ortalaması (B mod) veya dış ısı (F mod) üzerinden ısıtma isteği üretmek +- used_out_heat mantığı ile dış ısıya hafta sonu / konfor offset uygulamak + +Bağımlılıklar +-------------- +- building.Building +- environment.BuildingEnvironment +- season.SeasonController +- io.relay_driver.RelayDriver +- io.dbtext.DBText +- io.legacy_syslog (syslog/console çıktıları için) +- config_statics (cfg_s) +- config_runtime (cfg_v) + +Notlar +------ +- Brülör, igniter ve pompalar relay_driver içinde isimlendirilmiş kanallarla + temsil edilir. +- Bu dosya, eski sistemle uyum için mümkün olduğunca log formatını korumaya + çalışır. +""" + +import datetime +import time as _time +from dataclasses import dataclass +from typing import Optional, Dict, Any, List, Tuple + +from ..building import Building +from ..season import SeasonController +from ..environment import BuildingEnvironment +from ...io.relay_driver import RelayDriver +from ...io.dbtext import DBText +from ...io import legacy_syslog as lsys +from ... import config_statics as cfg_s +from ... import config_runtime as cfg_v + + +# ------------------------------------------------------------- +# Yardımcı: DS18B20 okuma (hat sensörleri için) +# ------------------------------------------------------------- + + +@dataclass +class BurnerState: + burner_on: bool + pumps_on: Tuple[str, ...] + fire_setpoint_c: float + last_change_ts: datetime.datetime + reason: str + last_building_avg: Optional[float] + last_outside_c: Optional[float] + last_used_out_c: Optional[float] + last_mode: str + + +# ----------------------------- Isı eğrisi -------------------- + +# Dış ısı → kazan çıkış setpoint haritası +# Örnek bir eğri; config_runtime ile override edilebilir. +BURNER_FIRE_SETPOINT_MAP: Dict[float, Dict[str, float]] = getattr( + cfg_v, + "BURNER_FIRE_SETPOINT_MAP", + { + -10.0: {"fire": 50.0}, + -5.0: {"fire": 48.0}, + 0.0: {"fire": 46.0}, + 5.0: {"fire": 44.0}, + 10.0: {"fire": 40.0}, + 15.0: {"fire": 35.0}, + 20.0: {"fire": 30.0}, + 25.0: {"fire": 26.0}, + }, +) + + +class BurnerConfig: + """ + Brülör çalışma parametreleri (runtime config'ten override edilebilir). + """ + + min_run_sec: int = 60 # brülör en az bu kadar saniye çalışsın + min_stop_sec: int = 60 # brülör en az bu kadar saniye duruşta kalsın + hysteresis_c: float = 0.5 # bina ortalaması için histerezis + + +# --------------------------------------------------------- +# Yardımcı fonksiyon: bina istatistikleri +# --------------------------------------------------------- + + +def _safe_float(value: Any, default: Optional[float] = None) -> Optional[float]: + try: + if value is None: + return default + return float(value) + except Exception: + return default + + +def _merge_stats(old: Optional[Dict[str, Any]], new: Dict[str, Any]) -> Dict[str, Any]: + """ + Bina istatistiği için min/avg/max birleştirme. + """ + if old is None: + return dict(new) + + def _pick(key: str, func): + a = old.get(key) + b = new.get(key) + if a is None: + return b + if b is None: + return a + return func(a, b) + + return { + "min": _pick("min", min), + "avg": new.get("avg"), + "max": _pick("max", max), + } + + +# --------------------------------------------------------- +# used_out_heat hesabı +# --------------------------------------------------------- + + +def _apply_weekend_and_comfort( + used_out: Optional[float], + now: datetime.datetime, + weekend_boost_c: float, + comfort_offset_c: float, +) -> Optional[float]: + """ + Haftasonu ve konfor offset'ini used_out üzerine uygular. + """ + if used_out is None: + return None + + result = float(used_out) + + # Haftasonu boost: Cumartesi / Pazar + if now.weekday() >= 5 and weekend_boost_c != 0.0: + result -= weekend_boost_c + + # Konfor offset'i + if comfort_offset_c != 0.0: + result -= comfort_offset_c + + return result + + +def pick_fire_setpoint(outside_c: Optional[float]) -> float: + """ + Dış ısı (used_out_heat) için en yakın fire setpoint'i döndürür. + + Eğer outside_c None ise, MAX_OUTLET_C kullanılır. + """ + if outside_c is None: + return float(getattr(cfg_v, "MAX_OUTLET_C", 45.0)) + + keys = sorted(BURNER_FIRE_SETPOINT_MAP.keys()) + nearest_key = min(keys, key=lambda k: abs(k - outside_c)) + mapping = BURNER_FIRE_SETPOINT_MAP.get(nearest_key, {}) + return float(mapping.get("fire", getattr(cfg_v, "MAX_OUTLET_C", 45.0))) + + +# --------------------------------------------------------- +# Ana sınıf: BurnerController +# --------------------------------------------------------- + + +class BurnerController: + """ + F/B moduna göre brülör kontrolü yapan sınıf. + + BUILD_BURNER = "B" + → bina ortalama sıcaklığına göre kontrol + + BUILD_BURNER = "F" + → dış ısıya göre (OUTSIDE_LIMIT_HEAT_C) karar veren mod + (burada dış ısı olarak *used_out_heat* kullanılır). + """ + + def __init__( + self, + building: Building, + relay_driver: RelayDriver, + logger: Optional[DBText] = None, + config: Optional[BurnerConfig] = None, + burner_id: Optional[int] = None, + environment: Optional[BuildingEnvironment] = None, + ) -> None: + self.building = building + self.relays = relay_driver + # Runtime konfig: varsayılan BurnerConfig + config_runtime override + self.cfg = config or BurnerConfig() + try: + self.cfg.min_run_sec = int(getattr(cfg_v, "BURNER_MIN_RUN_SEC", self.cfg.min_run_sec)) + self.cfg.min_stop_sec = int(getattr(cfg_v, "BURNER_MIN_STOP_SEC", self.cfg.min_stop_sec)) + self.cfg.hysteresis_c = float(getattr(cfg_v, "BURNER_HYSTERESIS_C", self.cfg.hysteresis_c)) + except Exception as e: + print("BurnerConfig override error:", e) + + # Hangi brülör? → config_statics.BURNER_DEFAULT_ID veya parametre + default_id = int(getattr(cfg_s, "BURNER_DEFAULT_ID", 0)) + self.burner_id = int(burner_id) if burner_id is not None else default_id + + # DBText logger + log_file = getattr(cfg_s, "BURNER_LOG_FILE", "ebuild_burner_log.sql") + log_table = getattr(cfg_s, "BURNER_LOG_TABLE", "eburner_log") + self.logger = logger or DBText( + filename=log_file, + table=log_table, + app="EBURNER", + ) + + max_out = float(getattr(cfg_v, "MAX_OUTLET_C", 45.0)) + + # Röle kanal isimleri (eski yapı ile uyum için fallback) + self.igniter_ch: str = getattr(cfg_s, "BURNER_IGNITER_CH", "igniter") + self.pump_channels: List[str] = list( + getattr(cfg_s, "BURNER_PUMPS", ["circulation_a", "circulation_b"]) + ) + self.default_pumps: List[str] = list( + getattr(cfg_s, "BURNER_DEFAULT_PUMPS", ["circulation_a"]) + ) + + # Bina okuma periyodu (BUILDING_READ_PERIOD_S) + self._building_last_read_ts: Optional[datetime.datetime] = None + self._building_read_period: float = float( + getattr(cfg_v, "BUILDING_READ_PERIOD_S", 60.0) + ) + self._building_last_stats: Optional[Dict[str, Any]] = None + + # used_out_heat için parametreler + self.used_out_c: Optional[float] = None + self._last_used_update_ts: Optional[datetime.datetime] = None + self.outside_smooth_sec: float = float( + getattr(cfg_v, "OUTSIDE_SMOOTH_SECONDS", 900.0) + ) + self.weekend_boost_c: float = float( + getattr(cfg_v, "WEEKEND_HEAT_BOOST_C", 0.0) + ) + self.comfort_offset_c: float = float( + getattr(cfg_v, "BURNER_COMFORT_OFFSET_C", 0.0) + ) + + # Ortam nesnesi (opsiyonel) + self.environment = environment + + # Ortamdan başlangıç dış ısı alınabiliyorsa used_out'u hemen doldur + if self.environment is not None: + try: + first_out = self.environment.get_outside_temp_cached() + except Exception: + first_out = None + if first_out is not None: + self.used_out_c = first_out + self._last_used_update_ts = datetime.datetime.now() + + # Çalışma modu + cfg_mode = str(getattr(cfg_s, "BUILD_BURNER", "F")).upper() + initial_mode = cfg_mode if cfg_mode in ("F", "B") else "F" + + # Başlangıç state + self.state = BurnerState( + burner_on=False, + pumps_on=tuple(), + fire_setpoint_c=max_out, + last_change_ts=datetime.datetime.now(), + reason="init", + last_building_avg=None, + last_outside_c=None, + last_used_out_c=None, + last_mode=initial_mode, + ) + + # Mevsim / güneş bilgisi (syslog üst block için) + try: + self.season = SeasonController.from_now() + except Exception as e: + print("SeasonController.from_now() hata:", e) + self.season = None + + # --------------------------------------------------------- + # Bina istatistikleri + # --------------------------------------------------------- + + def _get_building_stats(self, now: datetime.datetime) -> Optional[Dict[str, Any]]: + """ + Bina ortalaması / min / max gibi istatistikleri periyodik olarak okur. + BUILDING_READ_PERIOD_S içinde cache kullanır. + """ + if self._building_last_read_ts is None: + need_read = True + else: + delta = (now - self._building_last_read_ts).total_seconds() + need_read = delta >= self._building_read_period + + if not need_read: + return self._building_last_stats + + self._building_last_read_ts = now + return None + try: + stats = self.building.get_stats() + except Exception as e: + print("Building.get_stats() hata:", e) + return self._building_last_stats + + self._building_last_stats = stats + return stats + + # --------------------------------------------------------- + # used_out_heat güncelleme + # --------------------------------------------------------- + + def _update_used_out(self, now: datetime.datetime, outside_c: Optional[float]) -> Optional[float]: + """ + Dış ısı okumasına göre used_out_heat günceller. + - OUTSIDE_SMOOTH_SECONDS süresince eksponansiyel smoothing + - Haftasonu ve konfor offset'i eklenir. + """ + raw = outside_c + + if raw is None: + return self.used_out_c + + # Smooth + if self.used_out_c is None or self._last_used_update_ts is None: + smoothed = raw + else: + dt = (now - self._last_used_update_ts).total_seconds() + if dt <= 0: + smoothed = self.used_out_c + else: + tau = max(1.0, self.outside_smooth_sec) + alpha = min(1.0, dt / tau) + smoothed = (1.0 - alpha) * self.used_out_c + alpha * raw + + self.used_out_c = smoothed + self._last_used_update_ts = now + + # Haftasonu / konfor offset'i uygula + final_used = _apply_weekend_and_comfort( + smoothed, + now, + self.weekend_boost_c, + self.comfort_offset_c, + ) + return final_used + + # --------------------------------------------------------- + # Isı ihtiyacı kararları + # --------------------------------------------------------- + + def _should_heat_by_outside(self, used_out: Optional[float]) -> bool: + """ + F modunda (dış ısıya göre) ısıtma isteği. + """ + limit = float(getattr(cfg_v, "OUTSIDE_HEAT_LIMIT_C", 17.0)) + if used_out is None: + return False + + want = used_out < limit + print(f"should_heat_by_outside: used={used_out:.3f}C limit={limit:.1f}C") + return want + + def _should_heat_by_building(self, building_avg: Optional[float], now: datetime.datetime) -> bool: + """ + B modunda bina ortalaması + konfor setpoint'e göre ısıtma isteği. + """ + comfort = float(getattr(cfg_v, "COMFORT_SETPOINT_C", 23.0)) + h = self.cfg.hysteresis_c + + if building_avg is None: + return False + + if building_avg < (comfort - h): + return True + if building_avg > (comfort + h): + return False + + # Histerezis bandında önceki state'i koru + return self.state.burner_on + + # --------------------------------------------------------- + # Min çalışma / durma süreleri + # --------------------------------------------------------- + + def _respect_min_times(self, now: datetime.datetime, want_on: bool) -> bool: + """ + min_run_sec / min_stop_sec kurallarını uygular. + - İlk açılışta (state.reason == 'init') kısıtlama uygulanmaz. + """ + # İlk tick: min_run/min_stop uygulama + try: + if getattr(self.state, "reason", "") == "init": + return want_on + except Exception: + pass + + elapsed = (now - self.state.last_change_ts).total_seconds() + + if self.state.burner_on: + # Çalışırken min_run dolmadan kapatma + if not want_on and elapsed < self.cfg.min_run_sec: + return True + else: + # Kapalıyken min_stop dolmadan açma + if want_on and elapsed < self.cfg.min_stop_sec: + return False + + return want_on + + # --------------------------------------------------------- + # Çıkışları rölelere uygulama + # --------------------------------------------------------- + + def _apply_outputs( + self, + now: datetime.datetime, + mode: str, + burner_on: bool, + pumps_on: Tuple[str, ...], + fire_setpoint_c: float, + reason: str, + ) -> None: + """ + Röleleri sürer, state'i günceller, log ve syslog üretir. + """ + # 1) Röle sürücüsü (igniter + pompalar) + try: + # Yeni API: RelayDriver brülör-aware ise + if hasattr(self.relays, "set_igniter"): + # Brülör ateşleme + self.relays.set_igniter(self.burner_id, burner_on) + + # Pompalar: her zaman kanal isimleri üzerinden sür + if hasattr(self.relays, "all_pumps"): + all_pumps = list(self.relays.all_pumps(self.burner_id)) # ['circulation_a', ...] + for ch in all_pumps: + self.relays.set_channel(ch, (ch in pumps_on)) + else: + # all_pumps yoksa, config_statics'ten gelen pump_channels ile sür + for ch in self.pump_channels: + self.relays.set_channel(ch, (ch in pumps_on)) + else: + # Eski/çok basit API: doğrudan kanal adları + self.relays.set_channel(self.igniter_ch, burner_on) + for ch in self.pump_channels: + self.relays.set_channel(ch, (ch in pumps_on)) + except Exception as exc: + # legacy_syslog.log_error YOK, bu yüzden ya loga yaz ya da print et + try: + msg = f"[relay_error] igniter_ch={self.igniter_ch} burner_on={burner_on} pumps_on={pumps_on} exc={exc}" + lsys.send_legacy_syslog(lsys.format_line(98, msg)) + except Exception: + print("Relay error in _apply_outputs:", exc) + + # 2) State güncelle + if burner_on != self.state.burner_on or tuple(pumps_on) != self.state.pumps_on: + self.state.last_change_ts = now + + self.state.burner_on = burner_on + self.state.pumps_on = tuple(pumps_on) + self.state.fire_setpoint_c = fire_setpoint_c + self.state.reason = reason + self.state.last_mode = mode + + # 3) DBText logger'a yaz + try: + self.logger.insert( + { + "ts": now, + "mode": mode, + "burner_on": int(burner_on), + "pumps": ",".join(pumps_on), + "fire_sp": fire_setpoint_c, + "reason": reason, + "bavg": _safe_float(self.state.last_building_avg), + "out": _safe_float(self.state.last_outside_c), + "used": _safe_float(self.state.last_used_out_c), + } + ) + except Exception: + pass + + # 4) Syslog / console üst blok + try: + lsys.log_burner_header( + now=now, + mode=mode, + season=self.season, + building_avg=self.state.last_building_avg, + outside_c=self.state.last_outside_c, + used_out_c=self.state.last_used_out_c, + fire_sp=fire_setpoint_c, + burner_on=burner_on, + pumps_on=pumps_on, + ) + except Exception as exc: + # Burayı tamamen sessize almayalım, hatayı konsola basalım + print("BRULOR lsys.log_burner_header error:", exc, "burner.py _apply_outputs()") + + # --------------------------------------------------------- + # Ana tick fonksiyonu + # --------------------------------------------------------- + + def tick(self, outside_c: Optional[float] = None) -> BurnerState: + """ + Tek bir kontrol adımı. + + - Bina istatistiği BUILDING_READ_PERIOD_S periyodunda bir kez okunur, + aradaki tick'lerde cache kullanılır. + - F modunda kararlar *used_out_heat* üzerinden verilir. + """ + now = datetime.datetime.now() + cfg_mode = str(getattr(cfg_s, "BUILD_BURNER", "F")).upper() + mode = cfg_mode + + print("tick outside_c:", outside_c) + # 0) dış ısı: parametre yoksa ortamdan al + if outside_c is None and getattr(self, "environment", None) is not None: + try: + outside_c = self.environment.get_outside_temp_cached() + except Exception: + outside_c = None + print("env:", getattr(self, "environment", None)) + print("tick outside_c 2:", outside_c) + + # 1) bina istatistiği (periyodik) + stats = self._get_building_stats(now) + building_avg = stats.get("avg") if stats else None + + # 2) used_out_heat güncelle + used_out = self._update_used_out(now, outside_c) + + self.state.last_building_avg = building_avg + self.state.last_outside_c = outside_c + self.state.last_used_out_c = used_out + + # 3) ısıtma ihtiyacı + if mode == "F": + want_heat = self._should_heat_by_outside(used_out) + else: + mode = "B" # saçma değer gelirse B moduna zorla + want_heat = self._should_heat_by_building(building_avg, now) + + want_heat = self._respect_min_times(now, want_heat) + + # 4) fire setpoint – F modunda da used_out üzerinden okunur + fire_sp = pick_fire_setpoint(used_out) + max_out = float(getattr(cfg_v, "MAX_OUTLET_C", 45.0)) + fire_sp = min(fire_sp, max_out) + + # 5) pompalar + if want_heat: + if hasattr(self.relays, "enabled_pumps"): + try: + pumps_list = list(self.relays.enabled_pumps(self.burner_id)) + pumps = tuple(pumps_list) + except Exception: + pumps = tuple(self.default_pumps) + else: + pumps = tuple(self.default_pumps) + else: + pumps = tuple() + + reason = ( + f"avg={building_avg}C " + f"outside_raw={outside_c}C " + f"used={used_out}C " + f"want_heat={want_heat}" + ) + print("tick reason", reason) + + # 7) Rölelere uygula + self._apply_outputs( + now=now, + mode=mode, + burner_on=bool(want_heat), + pumps_on=pumps, + fire_setpoint_c=fire_sp, + reason=reason, + ) + print("state", self.state) + return self.state + + +# ------------------------------------------------------------- +# CLI / demo +# ------------------------------------------------------------- + + +def _demo() -> None: + """ + Basit demo: Building + RelayDriver + BuildingEnvironment ile + BurnerController'ı ayağa kaldır, tick() döngüsü yap. + """ + # 1) Bina + try: + building = Building() + print("✅ Building: statics yüklendi\n") + print(building.pretty_summary()) + except Exception as e: + print("❌ Building oluşturulamadı:", e) + raise SystemExit(1) + + # 2) Ortam (dış ısı, ADC vs.) + try: + env = BuildingEnvironment() + except Exception as e: + print("⚠️ BuildingEnvironment oluşturulamadı:", e) + env = None + + # 3) Röle sürücüsü + rel = RelayDriver(onoff=False) + + # 4) Denetleyici + ctrl = BurnerController(building, rel, environment=env) + + print("🔥 BurnerController başlatıldı") + print(f" Burner ID : {ctrl.burner_id}") + print(f" Çalışma modu (BUILD_BURNER): {getattr(cfg_s, 'BUILD_BURNER', 'F')} (F=dış ısı, B=bina ort)") + print(f" Igniter kanalı : {ctrl.igniter_ch}") + print(f" Pompa kanalları : {ctrl.pump_channels}") + print(f" Varsayılan pompalar : {ctrl.default_pumps}") + print(f" Konfor setpoint (°C) : {getattr(cfg_v, 'COMFORT_SETPOINT_C', 23.0)}") + print(f" Histerezis (°C) : {ctrl.cfg.hysteresis_c}") + print(f" Dış ısı limiti (°C) : {getattr(cfg_v, 'OUTSIDE_HEAT_LIMIT_C', 17.0)}") + print(f" Max kazan çıkış (°C) : {getattr(cfg_v, 'MAX_OUTLET_C', 45.0)}") + print(f" Bina okuma periyodu (s) : {ctrl._building_read_period}") + print(f" OUTSIDE_SMOOTH_SECONDS : {ctrl.outside_smooth_sec}") + print(f" WEEKEND_HEAT_BOOST_C : {ctrl.weekend_boost_c}") + print(f" BURNER_COMFORT_OFFSET_C : {ctrl.comfort_offset_c}") + print("----------------------------------------------------") + print("BurnerController demo (Ctrl+C ile çık)…") + + try: + while True: + ctrl.tick() + _time.sleep(5) + except KeyboardInterrupt: + print("\nCtrl+C alındı, çıkış hazırlanıyor…") + finally: + try: + rel.all_off() + print("🔌 Tüm röleler kapatıldı.") + except Exception as e: + print(f"⚠️ Röleleri kapatırken hata: {e}") + finally: + try: + rel.cleanup() + except Exception: + pass + + +if __name__ == "__main__": + _demo() diff --git a/ebuild/core/systems/burner.py~ b/ebuild/core/systems/burner.py~ new file mode 100644 index 0000000..7c5f4ef --- /dev/null +++ b/ebuild/core/systems/burner.py~ @@ -0,0 +1,678 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "burner" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Bina ve/veya dış ısıya göre brülör ve sirkülasyon kontrol çekirdeği" +__version__ = "0.4.3" +__date__ = "2025-11-22" + +""" +ebuild/core/systems/burner.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- BUILD_BURNER moduna göre (F/B) brülör ve sirkülasyon pompalarını yönetmek +- Bina ortalaması (B mod) veya dış ısı (F mod) üzerinden ısıtma isteği üretmek +- used_out_heat mantığı ile dış ısıya hafta sonu / konfor offset uygulamak + +Bağımlılıklar +-------------- +- building.Building +- environment.BuildingEnvironment +- season.SeasonController +- io.relay_driver.RelayDriver +- io.dbtext.DBText +- io.legacy_syslog (syslog/console çıktıları için) +- config_statics (cfg_s) +- config_runtime (cfg_v) + +Notlar +------ +- Brülör, igniter ve pompalar relay_driver içinde isimlendirilmiş kanallarla + temsil edilir. +- Bu dosya, eski sistemle uyum için mümkün olduğunca log formatını korumaya + çalışır. +""" + +import datetime +import time as _time +from dataclasses import dataclass +from typing import Optional, Dict, Any, List, Tuple + +from ..building import Building +from ..season import SeasonController +from ..environment import BuildingEnvironment +from ...io.relay_driver import RelayDriver +from ...io.dbtext import DBText +from ...io import legacy_syslog as lsys +from ... import config_statics as cfg_s +from ... import config_runtime as cfg_v + + +# ------------------------------------------------------------- +# Yardımcı: DS18B20 okuma (hat sensörleri için) +# ------------------------------------------------------------- + + +@dataclass +class BurnerState: + burner_on: bool + pumps_on: Tuple[str, ...] + fire_setpoint_c: float + last_change_ts: datetime.datetime + reason: str + last_building_avg: Optional[float] + last_outside_c: Optional[float] + last_used_out_c: Optional[float] + last_mode: str + + +# ----------------------------- Isı eğrisi -------------------- + +# Dış ısı → kazan çıkış setpoint haritası +# Örnek bir eğri; config_runtime ile override edilebilir. +BURNER_FIRE_SETPOINT_MAP: Dict[float, Dict[str, float]] = getattr( + cfg_v, + "BURNER_FIRE_SETPOINT_MAP", + { + -10.0: {"fire": 50.0}, + -5.0: {"fire": 48.0}, + 0.0: {"fire": 46.0}, + 5.0: {"fire": 44.0}, + 10.0: {"fire": 40.0}, + 15.0: {"fire": 35.0}, + 20.0: {"fire": 30.0}, + 25.0: {"fire": 26.0}, + }, +) + + +class BurnerConfig: + """ + Brülör çalışma parametreleri (runtime config'ten override edilebilir). + """ + + min_run_sec: int = 60 # brülör en az bu kadar saniye çalışsın + min_stop_sec: int = 60 # brülör en az bu kadar saniye duruşta kalsın + hysteresis_c: float = 0.5 # bina ortalaması için histerezis + + +# --------------------------------------------------------- +# Yardımcı fonksiyon: bina istatistikleri +# --------------------------------------------------------- + + +def _safe_float(value: Any, default: Optional[float] = None) -> Optional[float]: + try: + if value is None: + return default + return float(value) + except Exception: + return default + + +def _merge_stats(old: Optional[Dict[str, Any]], new: Dict[str, Any]) -> Dict[str, Any]: + """ + Bina istatistiği için min/avg/max birleştirme. + """ + if old is None: + return dict(new) + + def _pick(key: str, func): + a = old.get(key) + b = new.get(key) + if a is None: + return b + if b is None: + return a + return func(a, b) + + return { + "min": _pick("min", min), + "avg": new.get("avg"), + "max": _pick("max", max), + } + + +# --------------------------------------------------------- +# used_out_heat hesabı +# --------------------------------------------------------- + + +def _apply_weekend_and_comfort( + used_out: Optional[float], + now: datetime.datetime, + weekend_boost_c: float, + comfort_offset_c: float, +) -> Optional[float]: + """ + Haftasonu ve konfor offset'ini used_out üzerine uygular. + """ + if used_out is None: + return None + + result = float(used_out) + + # Haftasonu boost: Cumartesi / Pazar + if now.weekday() >= 5 and weekend_boost_c != 0.0: + result -= weekend_boost_c + + # Konfor offset'i + if comfort_offset_c != 0.0: + result -= comfort_offset_c + + return result + + +def pick_fire_setpoint(outside_c: Optional[float]) -> float: + """ + Dış ısı (used_out_heat) için en yakın fire setpoint'i döndürür. + + Eğer outside_c None ise, MAX_OUTLET_C kullanılır. + """ + if outside_c is None: + return float(getattr(cfg_v, "MAX_OUTLET_C", 45.0)) + + keys = sorted(BURNER_FIRE_SETPOINT_MAP.keys()) + nearest_key = min(keys, key=lambda k: abs(k - outside_c)) + mapping = BURNER_FIRE_SETPOINT_MAP.get(nearest_key, {}) + return float(mapping.get("fire", getattr(cfg_v, "MAX_OUTLET_C", 45.0))) + + +# --------------------------------------------------------- +# Ana sınıf: BurnerController +# --------------------------------------------------------- + + +class BurnerController: + """ + F/B moduna göre brülör kontrolü yapan sınıf. + + BUILD_BURNER = "B" + → bina ortalama sıcaklığına göre kontrol + + BUILD_BURNER = "F" + → dış ısıya göre (OUTSIDE_LIMIT_HEAT_C) karar veren mod + (burada dış ısı olarak *used_out_heat* kullanılır). + """ + + def __init__( + self, + building: Building, + relay_driver: RelayDriver, + logger: Optional[DBText] = None, + config: Optional[BurnerConfig] = None, + burner_id: Optional[int] = None, + environment: Optional[BuildingEnvironment] = None, + ) -> None: + self.building = building + self.relays = relay_driver + # Runtime konfig: varsayılan BurnerConfig + config_runtime override + self.cfg = config or BurnerConfig() + try: + self.cfg.min_run_sec = int(getattr(cfg_v, "BURNER_MIN_RUN_SEC", self.cfg.min_run_sec)) + self.cfg.min_stop_sec = int(getattr(cfg_v, "BURNER_MIN_STOP_SEC", self.cfg.min_stop_sec)) + self.cfg.hysteresis_c = float(getattr(cfg_v, "BURNER_HYSTERESIS_C", self.cfg.hysteresis_c)) + except Exception as e: + print("BurnerConfig override error:", e) + + # Hangi brülör? → config_statics.BURNER_DEFAULT_ID veya parametre + default_id = int(getattr(cfg_s, "BURNER_DEFAULT_ID", 0)) + self.burner_id = int(burner_id) if burner_id is not None else default_id + + # DBText logger + log_file = getattr(cfg_s, "BURNER_LOG_FILE", "ebuild_burner_log.sql") + log_table = getattr(cfg_s, "BURNER_LOG_TABLE", "eburner_log") + self.logger = logger or DBText( + filename=log_file, + table=log_table, + app="EBURNER", + ) + + max_out = float(getattr(cfg_v, "MAX_OUTLET_C", 45.0)) + + # Röle kanal isimleri (eski yapı ile uyum için fallback) + self.igniter_ch: str = getattr(cfg_s, "BURNER_IGNITER_CH", "igniter") + self.pump_channels: List[str] = list( + getattr(cfg_s, "BURNER_PUMPS", ["circulation_a", "circulation_b"]) + ) + self.default_pumps: List[str] = list( + getattr(cfg_s, "BURNER_DEFAULT_PUMPS", ["circulation_a"]) + ) + + # Bina okuma periyodu (BUILDING_READ_PERIOD_S) + self._building_last_read_ts: Optional[datetime.datetime] = None + self._building_read_period: float = float( + getattr(cfg_v, "BUILDING_READ_PERIOD_S", 60.0) + ) + self._building_last_stats: Optional[Dict[str, Any]] = None + + # used_out_heat için parametreler + self.used_out_c: Optional[float] = None + self._last_used_update_ts: Optional[datetime.datetime] = None + self.outside_smooth_sec: float = float( + getattr(cfg_v, "OUTSIDE_SMOOTH_SECONDS", 900.0) + ) + self.weekend_boost_c: float = float( + getattr(cfg_v, "WEEKEND_HEAT_BOOST_C", 0.0) + ) + self.comfort_offset_c: float = float( + getattr(cfg_v, "BURNER_COMFORT_OFFSET_C", 0.0) + ) + + # Ortam nesnesi (opsiyonel) + self.environment = environment + + # Ortamdan başlangıç dış ısı alınabiliyorsa used_out'u hemen doldur + if self.environment is not None: + try: + first_out = self.environment.get_outside_temp_cached() + except Exception: + first_out = None + if first_out is not None: + self.used_out_c = first_out + self._last_used_update_ts = datetime.datetime.now() + + # Çalışma modu + cfg_mode = str(getattr(cfg_s, "BUILD_BURNER", "F")).upper() + initial_mode = cfg_mode if cfg_mode in ("F", "B") else "F" + + # Başlangıç state + self.state = BurnerState( + burner_on=False, + pumps_on=tuple(), + fire_setpoint_c=max_out, + last_change_ts=datetime.datetime.now(), + reason="init", + last_building_avg=None, + last_outside_c=None, + last_used_out_c=None, + last_mode=initial_mode, + ) + + # Mevsim / güneş bilgisi (syslog üst block için) + try: + self.season = SeasonController.from_now() + except Exception as e: + print("SeasonController.from_now() hata:", e) + self.season = None + + # --------------------------------------------------------- + # Bina istatistikleri + # --------------------------------------------------------- + + def _get_building_stats(self, now: datetime.datetime) -> Optional[Dict[str, Any]]: + """ + Bina ortalaması / min / max gibi istatistikleri periyodik olarak okur. + BUILDING_READ_PERIOD_S içinde cache kullanır. + """ + if self._building_last_read_ts is None: + need_read = True + else: + delta = (now - self._building_last_read_ts).total_seconds() + need_read = delta >= self._building_read_period + + if not need_read: + return self._building_last_stats + + try: + stats = self.building.get_stats() + except Exception as e: + print("Building.get_stats() hata:", e) + return self._building_last_stats + + self._building_last_read_ts = now + self._building_last_stats = stats + return stats + + # --------------------------------------------------------- + # used_out_heat güncelleme + # --------------------------------------------------------- + + def _update_used_out(self, now: datetime.datetime, outside_c: Optional[float]) -> Optional[float]: + """ + Dış ısı okumasına göre used_out_heat günceller. + - OUTSIDE_SMOOTH_SECONDS süresince eksponansiyel smoothing + - Haftasonu ve konfor offset'i eklenir. + """ + raw = outside_c + + if raw is None: + return self.used_out_c + + # Smooth + if self.used_out_c is None or self._last_used_update_ts is None: + smoothed = raw + else: + dt = (now - self._last_used_update_ts).total_seconds() + if dt <= 0: + smoothed = self.used_out_c + else: + tau = max(1.0, self.outside_smooth_sec) + alpha = min(1.0, dt / tau) + smoothed = (1.0 - alpha) * self.used_out_c + alpha * raw + + self.used_out_c = smoothed + self._last_used_update_ts = now + + # Haftasonu / konfor offset'i uygula + final_used = _apply_weekend_and_comfort( + smoothed, + now, + self.weekend_boost_c, + self.comfort_offset_c, + ) + return final_used + + # --------------------------------------------------------- + # Isı ihtiyacı kararları + # --------------------------------------------------------- + + def _should_heat_by_outside(self, used_out: Optional[float]) -> bool: + """ + F modunda (dış ısıya göre) ısıtma isteği. + """ + limit = float(getattr(cfg_v, "OUTSIDE_HEAT_LIMIT_C", 17.0)) + if used_out is None: + return False + + want = used_out < limit + print(f"should_heat_by_outside: used={used_out:.3f}C limit={limit:.1f}C") + return want + + def _should_heat_by_building(self, building_avg: Optional[float], now: datetime.datetime) -> bool: + """ + B modunda bina ortalaması + konfor setpoint'e göre ısıtma isteği. + """ + comfort = float(getattr(cfg_v, "COMFORT_SETPOINT_C", 23.0)) + h = self.cfg.hysteresis_c + + if building_avg is None: + return False + + if building_avg < (comfort - h): + return True + if building_avg > (comfort + h): + return False + + # Histerezis bandında önceki state'i koru + return self.state.burner_on + + # --------------------------------------------------------- + # Min çalışma / durma süreleri + # --------------------------------------------------------- + + def _respect_min_times(self, now: datetime.datetime, want_on: bool) -> bool: + """ + min_run_sec / min_stop_sec kurallarını uygular. + - İlk açılışta (state.reason == 'init') kısıtlama uygulanmaz. + """ + # İlk tick: min_run/min_stop uygulama + try: + if getattr(self.state, "reason", "") == "init": + return want_on + except Exception: + pass + + elapsed = (now - self.state.last_change_ts).total_seconds() + + if self.state.burner_on: + # Çalışırken min_run dolmadan kapatma + if not want_on and elapsed < self.cfg.min_run_sec: + return True + else: + # Kapalıyken min_stop dolmadan açma + if want_on and elapsed < self.cfg.min_stop_sec: + return False + + return want_on + + # --------------------------------------------------------- + # Çıkışları rölelere uygulama + # --------------------------------------------------------- + + def _apply_outputs( + self, + now: datetime.datetime, + mode: str, + burner_on: bool, + pumps_on: Tuple[str, ...], + fire_setpoint_c: float, + reason: str, + ) -> None: + """ + Röleleri sürer, state'i günceller, log ve syslog üretir. + """ + # 1) Röle sürücüsü (igniter + pompalar) + try: + # Yeni API: RelayDriver brülör-aware ise + if hasattr(self.relays, "set_igniter"): + # Brülör ateşleme + self.relays.set_igniter(self.burner_id, burner_on) + + # Pompalar: her zaman kanal isimleri üzerinden sür + if hasattr(self.relays, "all_pumps"): + all_pumps = list(self.relays.all_pumps(self.burner_id)) # ['circulation_a', ...] + for ch in all_pumps: + self.relays.set_channel(ch, (ch in pumps_on)) + else: + # all_pumps yoksa, config_statics'ten gelen pump_channels ile sür + for ch in self.pump_channels: + self.relays.set_channel(ch, (ch in pumps_on)) + else: + # Eski/çok basit API: doğrudan kanal adları + self.relays.set_channel(self.igniter_ch, burner_on) + for ch in self.pump_channels: + self.relays.set_channel(ch, (ch in pumps_on)) + except Exception as exc: + # legacy_syslog.log_error YOK, bu yüzden ya loga yaz ya da print et + try: + msg = f"[relay_error] igniter_ch={self.igniter_ch} burner_on={burner_on} pumps_on={pumps_on} exc={exc}" + lsys.send_legacy_syslog(lsys.format_line(98, msg)) + except Exception: + print("Relay error in _apply_outputs:", exc) + + # 2) State güncelle + if burner_on != self.state.burner_on or tuple(pumps_on) != self.state.pumps_on: + self.state.last_change_ts = now + + self.state.burner_on = burner_on + self.state.pumps_on = tuple(pumps_on) + self.state.fire_setpoint_c = fire_setpoint_c + self.state.reason = reason + self.state.last_mode = mode + + # 3) DBText logger'a yaz + try: + self.logger.insert( + { + "ts": now, + "mode": mode, + "burner_on": int(burner_on), + "pumps": ",".join(pumps_on), + "fire_sp": fire_setpoint_c, + "reason": reason, + "bavg": _safe_float(self.state.last_building_avg), + "out": _safe_float(self.state.last_outside_c), + "used": _safe_float(self.state.last_used_out_c), + } + ) + except Exception: + pass + + # 4) Syslog / console üst blok + try: + lsys.log_burner_header( + now=now, + mode=mode, + season=self.season, + building_avg=self.state.last_building_avg, + outside_c=self.state.last_outside_c, + used_out_c=self.state.last_used_out_c, + fire_sp=fire_setpoint_c, + burner_on=burner_on, + pumps_on=pumps_on, + ) + except Exception as exc: + # Burayı tamamen sessize almayalım, hatayı konsola basalım + print("BRULOR lsys.log_burner_header error:", exc, "burner.py _apply_outputs()") + + # --------------------------------------------------------- + # Ana tick fonksiyonu + # --------------------------------------------------------- + + def tick(self, outside_c: Optional[float] = None) -> BurnerState: + """ + Tek bir kontrol adımı. + + - Bina istatistiği BUILDING_READ_PERIOD_S periyodunda bir kez okunur, + aradaki tick'lerde cache kullanılır. + - F modunda kararlar *used_out_heat* üzerinden verilir. + """ + now = datetime.datetime.now() + cfg_mode = str(getattr(cfg_s, "BUILD_BURNER", "F")).upper() + mode = cfg_mode + + print("tick outside_c:", outside_c) + # 0) dış ısı: parametre yoksa ortamdan al + if outside_c is None and getattr(self, "environment", None) is not None: + try: + outside_c = self.environment.get_outside_temp_cached() + except Exception: + outside_c = None + print("env:", getattr(self, "environment", None)) + print("tick outside_c 2:", outside_c) + + # 1) bina istatistiği (periyodik) + stats = self._get_building_stats(now) + building_avg = stats.get("avg") if stats else None + + # 2) used_out_heat güncelle + used_out = self._update_used_out(now, outside_c) + + self.state.last_building_avg = building_avg + self.state.last_outside_c = outside_c + self.state.last_used_out_c = used_out + + # 3) ısıtma ihtiyacı + if mode == "F": + want_heat = self._should_heat_by_outside(used_out) + else: + mode = "B" # saçma değer gelirse B moduna zorla + want_heat = self._should_heat_by_building(building_avg, now) + + want_heat = self._respect_min_times(now, want_heat) + + # 4) fire setpoint – F modunda da used_out üzerinden okunur + fire_sp = pick_fire_setpoint(used_out) + max_out = float(getattr(cfg_v, "MAX_OUTLET_C", 45.0)) + fire_sp = min(fire_sp, max_out) + + # 5) pompalar + if want_heat: + if hasattr(self.relays, "enabled_pumps"): + try: + pumps_list = list(self.relays.enabled_pumps(self.burner_id)) + pumps = tuple(pumps_list) + except Exception: + pumps = tuple(self.default_pumps) + else: + pumps = tuple(self.default_pumps) + else: + pumps = tuple() + + reason = ( + f"avg={building_avg}C " + f"outside_raw={outside_c}C " + f"used={used_out}C " + f"want_heat={want_heat}" + ) + print("tick reason", reason) + + # 7) Rölelere uygula + self._apply_outputs( + now=now, + mode=mode, + burner_on=bool(want_heat), + pumps_on=pumps, + fire_setpoint_c=fire_sp, + reason=reason, + ) + print("state", self.state) + return self.state + + +# ------------------------------------------------------------- +# CLI / demo +# ------------------------------------------------------------- + + +def _demo() -> None: + """ + Basit demo: Building + RelayDriver + BuildingEnvironment ile + BurnerController'ı ayağa kaldır, tick() döngüsü yap. + """ + # 1) Bina + try: + building = Building() + print("✅ Building: statics yüklendi\n") + print(building.pretty_summary()) + except Exception as e: + print("❌ Building oluşturulamadı:", e) + raise SystemExit(1) + + # 2) Ortam (dış ısı, ADC vs.) + try: + env = BuildingEnvironment() + except Exception as e: + print("⚠️ BuildingEnvironment oluşturulamadı:", e) + env = None + + # 3) Röle sürücüsü + rel = RelayDriver(onoff=False) + + # 4) Denetleyici + ctrl = BurnerController(building, rel, environment=env) + + print("🔥 BurnerController başlatıldı") + print(f" Burner ID : {ctrl.burner_id}") + print(f" Çalışma modu (BUILD_BURNER): {getattr(cfg_s, 'BUILD_BURNER', 'F')} (F=dış ısı, B=bina ort)") + print(f" Igniter kanalı : {ctrl.igniter_ch}") + print(f" Pompa kanalları : {ctrl.pump_channels}") + print(f" Varsayılan pompalar : {ctrl.default_pumps}") + print(f" Konfor setpoint (°C) : {getattr(cfg_v, 'COMFORT_SETPOINT_C', 23.0)}") + print(f" Histerezis (°C) : {ctrl.cfg.hysteresis_c}") + print(f" Dış ısı limiti (°C) : {getattr(cfg_v, 'OUTSIDE_HEAT_LIMIT_C', 17.0)}") + print(f" Max kazan çıkış (°C) : {getattr(cfg_v, 'MAX_OUTLET_C', 45.0)}") + print(f" Bina okuma periyodu (s) : {ctrl._building_read_period}") + print(f" OUTSIDE_SMOOTH_SECONDS : {ctrl.outside_smooth_sec}") + print(f" WEEKEND_HEAT_BOOST_C : {ctrl.weekend_boost_c}") + print(f" BURNER_COMFORT_OFFSET_C : {ctrl.comfort_offset_c}") + print("----------------------------------------------------") + print("BurnerController demo (Ctrl+C ile çık)…") + + try: + while True: + ctrl.tick() + _time.sleep(5) + except KeyboardInterrupt: + print("\nCtrl+C alındı, çıkış hazırlanıyor…") + finally: + try: + rel.all_off() + print("🔌 Tüm röleler kapatıldı.") + except Exception as e: + print(f"⚠️ Röleleri kapatırken hata: {e}") + finally: + try: + rel.cleanup() + except Exception: + pass + + +if __name__ == "__main__": + _demo() diff --git a/ebuild/core/systems/firealarm.py b/ebuild/core/systems/firealarm.py new file mode 100644 index 0000000..1af8737 --- /dev/null +++ b/ebuild/core/systems/firealarm.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Yangın alarm sistemi iskeleti.""" diff --git a/ebuild/core/systems/hydrophore.py b/ebuild/core/systems/hydrophore.py new file mode 100644 index 0000000..ad26990 --- /dev/null +++ b/ebuild/core/systems/hydrophore.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Hidrofor sistemi iskeleti.""" diff --git a/ebuild/core/systems/irrigation.py b/ebuild/core/systems/irrigation.py new file mode 100644 index 0000000..6f2adc1 --- /dev/null +++ b/ebuild/core/systems/irrigation.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Sulama sistemi iskeleti.""" diff --git a/ebuild/io/__init__.py b/ebuild/io/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/ebuild/io/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/ebuild/io/__pycache__/__init__.cpython-39.pyc b/ebuild/io/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b31b3239e88958383772a4ce1a99858c7da0b294 GIT binary patch literal 133 zcmYe~<>g`kf+%zOObH&M4u=4F<|$LkeT-r}&y%}*)KNwou+@fnC20Dj&aHUIzs literal 0 HcmV?d00001 diff --git a/ebuild/io/__pycache__/adc_mcp3008.cpython-39.pyc b/ebuild/io/__pycache__/adc_mcp3008.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5654d02fa8fe20b5785ca00a45bc9ba3e8ddc9b GIT binary patch literal 12510 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 O`nbSx8plgG&ip^|>TrYr literal 0 HcmV?d00001 diff --git a/ebuild/io/__pycache__/config_ini.cpython-39.pyc b/ebuild/io/__pycache__/config_ini.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b2bb5db452335a8bdf58508adeb54258473a900 GIT binary patch literal 9666 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 literal 0 HcmV?d00001 diff --git a/ebuild/io/__pycache__/ds18b20.cpython-39.pyc b/ebuild/io/__pycache__/ds18b20.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89a7072274890c2efc16b68aedcf84d8a98df03b GIT binary patch literal 4426 zcmZ`+OK{u98QulJhbW4YB}K98rh{=ij@Xf?hn>XH*skkG(oPyVV|khh6AuRBt}K`! zKraA0VyR2y_SVVtl1r0V>ZOxQr@rLmL#L82J@(K8rl2>GzgCA&?db3+9*x7NsC076wUyd(r?k4f`r6{k z%HrzEdeuy=>s}*Ht)F>OoEC4kX+y5xpj{4Mc{Hw&ZQesgvN{(GHsP?zjIi*7O+?{y zOBBV}qa3VM662q9Q5F-AEZD1}Ta#i6tvp6k-w82|RzaB1%4|B(lV$^34^;x=v67AJ zwrtv)p0fMG4nzweT`XIX=i5?9RV(S?ho5z%?|V&Osx|#$@%YNxP>%9k-(KtMt>JCE z9orMHMxH$ntp#iLnbix6%XGc|`m%iU!nrfm-rP+$l1|%=w=sPw+KHAnlW6JT%94-| zyoQYI`3J6w+?}H*z8m!CDCr6ZJ8estG*NQCipfzJ92@ND@zE3e&wspTH@qP70wDui z9DW@LZ9Anu{e0$IKDVBlQLH)>eWQJd)}7Q^4+B}X(tIXpIyTsJY6WgfrgMLI5( z3Kd=?L7YzcZWIq|6vA4O^tX;bpx5|{sW~k5yt=dx2| z!IpJdolO1&LA480G*fgV#K^7+4XVFY==vuU| zy3ZcF>gdUutrgyn+|_fn^XJ~kLN6OigMR`nU9%}J?D-*2vRxIsYQY|MHTx~skE9*? zi8@{-Y(26hFF8VQXGx3xDI0HR*aRYxpy>k1l>O^XVZ5gN& zc$1D1y7*ooqqOkTn>Q#*(i~vGYo|pSi0Gk5F}4LzNlQO>{Y3VLXr-xXETKrQbnM2* z4XLqTAv3dTUeSh9zLn;()y+0S)>Q7p)Qp{m4y>$rnZ`}M2y#Ed+lbV`iUzOnvxdcs z<}~gKFY=;sl9wr-5K(3HQmym7(a3sn!PMFeLw_WmNP#A99ZwXiF=A;SK6uYO;J_fB zyo;9u-@B%9UWCz(i&P0M2X;$7Xe2QiyNyDdg|L_`&ryLELgQKZVhn;8lPj1w5WE+3@XBTr!U@;LBXV_GJ^Z=@wlS1#YJ+L1ar2$J zdE?ft&dkWJ=P8L?>WnS)GHF%?lSv|7)d3b=dd{oRmi90L^bDJ|ZyA|yP!aFaGY@ya0Q#Dip!`7=sLT=iZAu5_7O~Q&N(o#?8t4Wk>Vr6Zbs~|%?#s`>* z;i_PEpfsQjO>aPxG^z0kAhk2gXOFjJ+ya;K4u9_j_KvFnL9GU6XR)xA*nxRN7ej(y#hS>xn*%HU<)tV&>e2hB_3_fr%h`0uDrs>u@SU}}C_(4(-DX|60!jb$CH^O{`w0WKF=~PJcB>56k2Clw= z@5q)`V0`$r_3c^&VS}3OAc1!RrhBUOX)4&}aoik!rUKa<%~v1(52IWdCYdYe&u_hX zX2Gu2YIg>k>R4c*KO7O7R8A~ygItVMco*<+X9~h*$OmzMW8AkkGDohOLts@T7D#bW zHBzItobvVy&YqSok}Qp|)xNxkrT>MSbzVJo!J6=*M)&}tUi8BTvgBn{`ZKDz<8P@c z%*=S6b=MC!0RuXj6hQc5sRD5Rj4mVAH5ZRw+)Axbn6TO>MYD)83XU^N}pbhK?=Sc5I|+{Jn3-TZGGiAj5P&#uqin zWU*xSKvT&m@#AddXiTN!cV+Cr$PhgG6=r9Ovn*cbvwXl@DZ+*ZQm_(+RtxGpeepFa zUZ>&>Dl}5+tsu~b@lk(Uhw=qzJTv9b?T-XfOIKWY4P=)T^%$pl>B~asqNw1f*k*6ML}+c=WkRyp6Mgla4!1 zJ5k^%g#2j0RU;f`(ZD{08`FF`+GtNr^YKpG3+^iN3Pnhw$Tu>L)8@50>Lw0&nJKQ| zU7BkHXycSeiquhu|7vZgIggH_+A4JJqL(_qq&)t=*(EJr%<|M_5=xV$GH6ooHwT); VXU)oc6}t#}M6Du7Q;|>M`Cso+Xl(!h literal 0 HcmV?d00001 diff --git a/ebuild/io/__pycache__/legacy_syslog.cpython-39.pyc b/ebuild/io/__pycache__/legacy_syslog.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f12770adcc3f9c45bc169946f2e6a17acc232e61 GIT binary patch literal 9421 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 USa`WnFbn97{<8NmqX2&WAJ`0%CjbBd literal 0 HcmV?d00001 diff --git a/ebuild/io/__pycache__/relay_driver.cpython-39.pyc b/ebuild/io/__pycache__/relay_driver.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9753d829ab8bb63c4164e92e9c78404ffa58b3d GIT binary patch literal 9776 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 B-%S7j literal 0 HcmV?d00001 diff --git a/ebuild/io/adc_mcp3008.py b/ebuild/io/adc_mcp3008.py new file mode 100644 index 0000000..3da5615 --- /dev/null +++ b/ebuild/io/adc_mcp3008.py @@ -0,0 +1,423 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "analog_sensors" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "MCP3008 tabanlı basınç, gaz, yağmur ve LDR sensörleri için sınıf bazlı arayüz" +__version__ = "0.1.0" +__date__ = "2025-11-21" + +""" +ebuild/core/analog_sensors.py + +Revision : 2025-11-21 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- MCP3008 ADC üzerinden bağlı analog sensörler için tekil sınıf yapıları + sağlamak: + * PressureAnalogSensor : su hattı basınç sensörü + * GasAnalogSensor : MQ-4 veya benzeri gaz sensörü + * RainAnalogSensor : yağmur sensörü (wet/dry) + * LDRAnalogSensor : ışık seviyesi sensörü +- Her bir sensör: + * MCP3008ADC üzerinden ilgili kanalı okur (config_statics.ADC_CHANNELS). + * Ham raw (0..1023) ve volt cinsinden değer döndürebilir. + * Eşik ve basit state (SAFE/WARN/ALARM vb.) hesabını kendi içinde tutar. +- Güvenlik ve uyarı mantığı üst kattaki HeatEngine/Burner/Buzzer/Legacy + ile kolay entegre edilebilir. + +Notlar +------ +- Bu modül "karar mantığı" ve analog okuma katmanını birleştirir. +- Röle kapama, sistem shutdown, buzzer vb. aksiyonlar yine üst katmanda + yapılmalıdır. +""" + +from dataclasses import dataclass, field +from typing import Optional, Dict + +try: + from ..io.adc_mcp3008 import MCP3008ADC + from .. import config_statics as cfg +except ImportError: + MCP3008ADC = None # type: ignore + cfg = None # type: ignore + + +# ------------------------------------------------------------- +# Ortak durum enum'u +# ------------------------------------------------------------- +class SafetyState: + SAFE = "SAFE" + WARN = "WARN" + ALARM = "ALARM" + + +# ------------------------------------------------------------- +# Ortak base sınıf +# ------------------------------------------------------------- +@dataclass +class BaseAnalogSensor: + """ + MCP3008 üzerinden tek bir analog kanalı temsil eden temel sınıf. + + Özellikler: + ----------- + - adc : MCP3008ADC örneği + - channel : int kanal no (0..7) + - name : mantıksal isim (örn: "gas", "pressure") + - last_raw : son okunan ham değer (0..1023) + - last_volt : son okunan volt cinsinden değer + """ + + adc: MCP3008ADC + name: str + channel: Optional[int] = None + + last_raw: Optional[int] = None + last_volt: Optional[float] = None + + def __post_init__(self) -> None: + # Eğer kanal configten alınacaksa burada çöz + if self.channel is None and cfg is not None: + ch_map = getattr(cfg, "ADC_CHANNELS", {}) + if self.name in ch_map: + self.channel = int(ch_map[self.name]) + if self.channel is None: + raise ValueError(f"{self.__class__.__name__}: '{self.name}' için kanal bulunamadı.") + + # ------------------------------------------------------------------ + def read_raw(self) -> Optional[int]: + """ + ADC'den ham değeri okur (0..1023). + """ + if self.channel is None: + return None + raw = self.adc.read_raw(self.channel) + self.last_raw = raw + return raw + + def read_voltage(self) -> Optional[float]: + """ + ADC'den raw okur ve volt cinsine çevirir. + """ + if self.channel is None: + return None + volt = self.adc.read_voltage(self.channel) + self.last_volt = volt + return volt + + def update(self) -> Optional[int]: + """ + Varsayılan olarak sadece raw okur; alt sınıflar state hesaplarını + kendi override'larında yapar. + """ + return self.read_raw() + + def summary(self) -> str: + return f"{self.__class__.__name__}(name={self.name}, ch={self.channel}, raw={self.last_raw}, V={self.last_volt})" + + +# ------------------------------------------------------------- +# Gaz sensörü (MQ-4) – kill switch mantığı ile +# ------------------------------------------------------------- +@dataclass +class GasAnalogSensor(BaseAnalogSensor): + """ + Gaz sensörü (MQ-4) için analog ve güvenlik mantığı. + + State mantığı: + - raw >= alarm_threshold → ALARM, latched + - raw >= warn_threshold → WARN (latched varsa ALARM) + - trend (slope) ile hızlı artış + warn üstü → ALARM + - Diğer durumlarda SAFE (latched yoksa). + + latched_alarm True olduğu sürece: + - state ALARM olarak kalır + - should_shutdown_system() True döner + """ + + warn_threshold: int = field(default=150) + alarm_threshold: int = field(default=250) + slope_min_delta: int = field(default=30) + slope_window: int = field(default=5) + + history_len: int = field(default=20) + + state: str = SafetyState.SAFE + latched_alarm: bool = False + _history: list[int] = field(default_factory=list) + + def __post_init__(self) -> None: + super().__post_init__() + # Konfig override + if cfg is not None: + self.warn_threshold = int(getattr(cfg, "GAS_WARN_THRESHOLD_RAW", self.warn_threshold)) + self.alarm_threshold = int(getattr(cfg, "GAS_ALARM_THRESHOLD_RAW", self.alarm_threshold)) + self.slope_min_delta = int(getattr(cfg, "GAS_SLOPE_MIN_DELTA", self.slope_min_delta)) + self.slope_window = int(getattr(cfg, "GAS_SLOPE_WINDOW", self.slope_window)) + + # ------------------------------------------------------------------ + def reset_latch(self) -> None: + """ + Gaz alarm latch'ini manuel olarak sıfırlar. + """ + self.latched_alarm = False + # state sonraki update ile yeniden değerlendirilecek. + + def update(self) -> Optional[int]: + """ + Ham değeri okur ve state hesaplar. + """ + raw = self.read_raw() + if raw is None: + return None + + # history güncelle + self._history.append(raw) + if len(self._history) > self.history_len: + self._history = self._history[-self.history_len:] + + self._evaluate_state(raw) + return raw + + def _evaluate_state(self, raw: int) -> None: + # Trend kontrolü + slope_alarm = False + if len(self._history) >= self.slope_window: + first = self._history[-self.slope_window] + delta = raw - first + if delta >= self.slope_min_delta: + slope_alarm = True + + # Eşik mantığı + if raw >= self.alarm_threshold or (slope_alarm and raw >= self.warn_threshold): + self.state = SafetyState.ALARM + self.latched_alarm = True + elif raw >= self.warn_threshold: + if self.latched_alarm: + self.state = SafetyState.ALARM + else: + self.state = SafetyState.WARN + else: + if self.latched_alarm: + self.state = SafetyState.ALARM + else: + self.state = SafetyState.SAFE + + def should_shutdown_system(self) -> bool: + """ + Gaz açısından sistemin tamamen kapatılması gerekip gerekmediğini + söyler. + """ + return self.latched_alarm + + def summary(self) -> str: + return ( + f"GasAnalogSensor(ch={self.channel}, raw={self.last_raw}, " + f"state={self.state}, latched={self.latched_alarm})" + ) + + +# ------------------------------------------------------------- +# Basınç sensörü – limit kontrolü +# ------------------------------------------------------------- +@dataclass +class PressureAnalogSensor(BaseAnalogSensor): + """ + Su hattı basınç sensörü. + + State mantığı: + - raw < (min_raw - warn_hyst) veya raw > (max_raw + warn_hyst) → WARN + - min_raw <= raw <= max_raw → SAFE + - Aradaki buffer bölgede state korunur. + """ + + min_raw: int = field(default=200) + max_raw: int = field(default=900) + warn_hyst: int = field(default=20) + + state: str = SafetyState.SAFE + + def __post_init__(self) -> None: + super().__post_init__() + if cfg is not None: + self.min_raw = int(getattr(cfg, "PRESSURE_MIN_RAW", self.min_raw)) + self.max_raw = int(getattr(cfg, "PRESSURE_MAX_RAW", self.max_raw)) + self.warn_hyst = int(getattr(cfg, "PRESSURE_WARN_HYST", self.warn_hyst)) + + def update(self) -> Optional[int]: + raw = self.read_raw() + if raw is None: + return None + self._evaluate_state(raw) + return raw + + def _evaluate_state(self, raw: int) -> None: + if raw < (self.min_raw - self.warn_hyst) or raw > (self.max_raw + self.warn_hyst): + self.state = SafetyState.WARN + elif self.min_raw <= raw <= self.max_raw: + self.state = SafetyState.SAFE + # Buffer bölgede state korunur. + + def is_pressure_ok(self) -> bool: + return self.state == SafetyState.SAFE + + def summary(self) -> str: + return ( + f"PressureAnalogSensor(ch={self.channel}, raw={self.last_raw}, " + f"state={self.state}, min={self.min_raw}, max={self.max_raw})" + ) + + +# ------------------------------------------------------------- +# Yağmur sensörü – basit dry/wet mantığı +# ------------------------------------------------------------- +@dataclass +class RainAnalogSensor(BaseAnalogSensor): + """ + Yağmur sensörü (analog). + + Basit model: + - raw <= dry_threshold → DRY + - raw >= wet_threshold → WET + - arası → MID + + Gerektiğinde bu sınıf geliştirilebilir (ör. şiddetli yağmur vs.). + """ + + dry_threshold: int = field(default=100) + wet_threshold: int = field(default=400) + + state: str = "UNKNOWN" # "DRY", "MID", "WET" + + def __post_init__(self) -> None: + super().__post_init__() + # İleride configten override eklenebilir: + if cfg is not None: + self.dry_threshold = int(getattr(cfg, "RAIN_DRY_THRESHOLD_RAW", self.dry_threshold)) + self.wet_threshold = int(getattr(cfg, "RAIN_WET_THRESHOLD_RAW", self.wet_threshold)) + + def update(self) -> Optional[int]: + raw = self.read_raw() + if raw is None: + return None + self._evaluate_state(raw) + return raw + + def _evaluate_state(self, raw: int) -> None: + if raw <= self.dry_threshold: + self.state = "DRY" + elif raw >= self.wet_threshold: + self.state = "WET" + else: + self.state = "MID" + + def is_raining(self) -> bool: + return self.state == "WET" + + def summary(self) -> str: + return ( + f"RainAnalogSensor(ch={self.channel}, raw={self.last_raw}, " + f"state={self.state}, dry_th={self.dry_threshold}, wet_th={self.wet_threshold})" + ) + + +# ------------------------------------------------------------- +# LDR sensörü – ışık seviyesi +# ------------------------------------------------------------- +@dataclass +class LDRAnalogSensor(BaseAnalogSensor): + """ + LDR (ışık) sensörü. + + Basit model: + - raw <= dark_threshold → DARK + - raw >= bright_threshold → BRIGHT + - arası → MID + + Bu bilgi: + - dış ortam karanlık/aydınlık + - gece/gündüz teyidi + - aydınlatma / gösterge kararları + için kullanılabilir. + """ + + dark_threshold: int = field(default=200) + bright_threshold: int = field(default=800) + + state: str = "UNKNOWN" # "DARK", "MID", "BRIGHT" + + def __post_init__(self) -> None: + super().__post_init__() + if cfg is not None: + self.dark_threshold = int(getattr(cfg, "LDR_DARK_THRESHOLD_RAW", self.dark_threshold)) + self.bright_threshold = int(getattr(cfg, "LDR_BRIGHT_THRESHOLD_RAW", self.bright_threshold)) + + def update(self) -> Optional[int]: + raw = self.read_raw() + if raw is None: + return None + self._evaluate_state(raw) + return raw + + def _evaluate_state(self, raw: int) -> None: + if raw <= self.dark_threshold: + self.state = "DARK" + elif raw >= self.bright_threshold: + self.state = "BRIGHT" + else: + self.state = "MID" + + def is_dark(self) -> bool: + return self.state == "DARK" + + def is_bright(self) -> bool: + return self.state == "BRIGHT" + + def summary(self) -> str: + return ( + f"LDRAnalogSensor(ch={self.channel}, raw={self.last_raw}, " + f"state={self.state}, dark_th={self.dark_threshold}, bright_th={self.bright_threshold})" + ) + + +# ------------------------------------------------------------- +# Tümünü toplayan minik hub (opsiyonel) +# ------------------------------------------------------------- +class AnalogSensorsHub: + """ + MCP3008 üstündeki tüm analog sensörleri yöneten yardımcı sınıf. + + - pressure : PressureAnalogSensor + - gas : GasAnalogSensor + - rain : RainAnalogSensor + - ldr : LDRAnalogSensor + """ + + def __init__(self, adc: MCP3008ADC) -> None: + self.adc = adc + + self.pressure = PressureAnalogSensor(adc=self.adc, name="pressure") + self.gas = GasAnalogSensor(adc=self.adc, name="gas") + self.rain = RainAnalogSensor(adc=self.adc, name="rain") + self.ldr = LDRAnalogSensor(adc=self.adc, name="ldr") + + def update_all(self) -> Dict[str, Optional[int]]: + """ + Tüm sensörleri günceller ve ham değerleri döndürür. + """ + return { + "pressure": self.pressure.update(), + "gas": self.gas.update(), + "rain": self.rain.update(), + "ldr": self.ldr.update(), + } + + def should_shutdown_system(self) -> bool: + """ + Gaz sensörü açısından kill-switch gerekip gerekmediğini söyler. + """ + return self.gas.should_shutdown_system() diff --git a/ebuild/io/config_ini.py b/ebuild/io/config_ini.py new file mode 100644 index 0000000..5f939e1 --- /dev/null +++ b/ebuild/io/config_ini.py @@ -0,0 +1,333 @@ +# -*- coding: utf-8 -*- +__title__ = "config_ini" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "INI tabanlı konfigürasyon ve değer depolama yardımcıları" +__version__ = "0.2.0" +__date__ = "2025-11-20" + +""" +ebuild/io/config_ini.py + +Revision : 2025-11-20 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +Eski EdmConfig yapısının modernize edilmiş, hatalardan arındırılmış ama +aynı API'yi koruyan sürümü. + +Bu modül: +- INI dosyalarını ConfigParser ile yönetir +- Eksik section/item gördüğünde otomatik oluşturur +- Dosya değişimini (mtime) izleyerek reload imkanı verir +- Basit bir kilit (lock) mekanizması ile aynı dosyaya birden fazla + yazma girişimini sıraya sokar. + +Kullanım Örnekleri +------------------ +- EdmConfig: + cfg = EdmConfig("/home/karatay/ebuild/config.ini") + port = cfg.item("serial", "ttyUSB0", "/dev/ttyUSB0") + +- ConfigDict: + section = cfg.get_section("serial") + tty0 = section.get_item("ttyUSB0") + +- KilitliDosya: + log = KilitliDosya("/var/log/ebuild.log") + log.yaz("merhaba dünya\\n") +""" + +import os +import time +from configparser import ConfigParser +import traceback as tb # eski davranışla uyum için bırakıldı + + +# --------------------------------------------------------------------------- +# ConfigDict – tek bir section'ın sözlük hali +# --------------------------------------------------------------------------- +class ConfigDict: + """ + Bir INI dosyasındaki tek bir section'ı sözlük benzeri interface ile + kullanmaya yarar. + + - Anahtar yoksa, otomatik olarak section içine eklenir ve boş string + ile başlatılır. + - Değerler her zaman string olarak saklanır. + """ + + def __init__(self, cfgfile: str, section_name: str): + self.cfgfile = cfgfile + self.section_name = section_name + + self.cfg = ConfigParser() + self.cfg.read(cfgfile) + + if not self.cfg.has_section(section_name): + self.cfg.add_section(section_name) + self._write() + + self.section = dict(self.cfg.items(section_name)) + + def _write(self) -> None: + """INI dosyasını diske yazar.""" + with open(self.cfgfile, "w") as f: + self.cfg.write(f) + + def get_item(self, item_name: str) -> str: + """ + Section içindeki bir item’ı döndürür. + Yoksa item'i oluşturur, boş string ile başlatır. + """ + try: + return self.section[item_name] + except KeyError: + # Yoksa ekle + self.cfg.set(self.section_name, item_name, "") + self._write() + + # Yeniden oku + self.cfg.read(self.cfgfile) + self.section = dict(self.cfg.items(self.section_name)) + return self.section.get(item_name, "") + + def set_item(self, item_name: str, value) -> None: + """ + Section içindeki bir item’ın değerini günceller (string'e çevirerek). + """ + value = str(value) + self.cfg.set(self.section_name, item_name, value) + self._write() + self.section[item_name] = value + + +# --------------------------------------------------------------------------- +# EdmConfig – bir INI dosyasını yöneten üst sınıf +# --------------------------------------------------------------------------- +class EdmConfig: + """ + Tek bir INI dosyası için üst seviye sarmalayıcı. + + Özellikler: + - Dosya yoksa otomatik oluşturur. + - item(section, name, default) ile değer okur; yoksa default yazar. + - reload() ile mtime kontrolü yaparak dosya değişimini algılar. + """ + + def __init__(self, cfg_file_name: str): + self.fname = cfg_file_name + + # Dosya yoksa oluştur + if not os.path.isfile(cfg_file_name): + with open(cfg_file_name, "w") as f: + f.write("") + + self.cfg = ConfigParser() + self.cfg.read(cfg_file_name) + + # İlk yükleme zamanı + try: + self.originalTime = os.path.getmtime(cfg_file_name) + except OSError: + self.originalTime = None + + # --------------------------- + # Reload mekanizması + # --------------------------- + def get_loadtime(self) -> float: + """Ini dosyasının son yüklenme zamanını (mtime) döndürür.""" + return self.originalTime + + def reload(self) -> bool: + """ + Dosya değişmişse yeniden okur, True döner. + Değişmemişse False döner. + """ + if self.fname is None: + return False + + try: + current = os.path.getmtime(self.fname) + except FileNotFoundError: + return False + + if self.originalTime is None or current > self.originalTime: + self.cfg.read(self.fname) + self.originalTime = current + return True + + return False + + # --------------------------- + # Section & item işlemleri + # --------------------------- + def add_section(self, section: str) -> None: + """Yeni bir section ekler (yoksa).""" + if not self.cfg.has_section(section): + self.cfg.add_section(section) + self._write() + + def add_item(self, section: str, item: str, value: str = "") -> None: + """ + İlgili section yoksa oluşturur, item yoksa ekler ve default + değerini yazar. + """ + if not self.cfg.has_section(section): + self.add_section(section) + + if not self.cfg.has_option(section, item): + self.cfg.set(section, item, str(value)) + self._write() + + def set_item(self, section: str, name: str, value="") -> None: + """ + Belirli bir section/key için değeri ayarlar (string'e çevirir). + """ + self.add_section(section) + self.cfg.set(section, name, str(value)) + self._write() + + def item(self, section: str, name: str, default="") -> str: + """ + INI'den item okur; yoksa veya boşsa default değeri yazar ve onu döndürür. + + eski davranışla uyumlu: her zaman string döner. + """ + try: + val = self.cfg.get(section, name).strip() + if val == "": + self.set_item(section, name, default) + return str(default) + return val + except Exception: + # Eski koddaki gibi stack trace istersen: + # print(tb.format_exc()) + self.add_item(section, name, default) + return str(default) + + def get_items(self, section: str) -> dict: + """Verilen section'daki tüm key/value çiftlerini dict olarak döndürür.""" + return dict(self.cfg.items(section)) + + def get_section(self, section_name: str) -> ConfigDict: + """ + Verilen section için ConfigDict nesnesi döndürür. + Section yoksa oluşturur. + """ + if not self.cfg.has_section(section_name): + self.cfg.add_section(section_name) + self._write() + return ConfigDict(self.fname, section_name) + + def get_section_names(self): + """INI içindeki tüm section isimlerini döndürür.""" + return self.cfg.sections() + + def get_key_names(self, section_name: str = ""): + """ + section_name verilirse o section altındaki key listesi, + verilmezse her section için key listelerini döndürür. + """ + if section_name: + if not self.cfg.has_section(section_name): + return [] + return list(self.cfg[section_name].keys()) + + return {s: list(self.cfg[s].keys()) for s in self.cfg.sections()} + + def get_section_values(self, section_name: str = ""): + """ + section_name verilirse o section'ın dict halini, + verilmezse tüm section'ların dict halini döndürür. + """ + if section_name: + if not self.cfg.has_section(section_name): + return {} + return dict(self.cfg.items(section_name)) + return {s: dict(self.cfg.items(s)) for s in self.cfg.sections()} + + def _write(self) -> None: + """Ini dosyasını diske yazar.""" + with open(self.fname, "w") as f: + self.cfg.write(f) + + +# --------------------------------------------------------------------------- +# KilitliDosya – çok basit file lock mekanizması +# --------------------------------------------------------------------------- +class KilitliDosya: + """ + Çok basit bir dosya kilit mekanizması. + + Aynı dosyaya birden fazla sürecin/yazmanın çakışmasını azaltmak için + `fname.LCK` dosyasını lock olarak kullanır. + """ + + def __init__(self, fname: str): + self.fname = fname + + def _lockfile(self) -> str: + return f"{self.fname}.LCK" + + def kontrol(self) -> bool: + """Lock dosyası var mı? True/False.""" + return os.path.exists(self._lockfile()) + + def kilitle(self) -> bool: + """ + Lock almaya çalışır. Lock yoksa oluşturur ve True döner. + Varsa False döner. + """ + if not self.kontrol(): + with open(self._lockfile(), "w") as f: + f.write(" ") + return True + return False + + def kilit_ac(self) -> None: + """Lock dosyasını kaldırır (yoksa sessizce geçer).""" + try: + os.remove(self._lockfile()) + except FileNotFoundError: + pass + + def oku(self): + """Ana dosyayı satır satır okur ve liste döndürür.""" + with open(self.fname, "r") as f: + return f.readlines() + + def yaz(self, text: str) -> bool: + """ + Dosyaya kilitleyerek ekleme yapar. + Lock alamazsa 10 deneme yapar, her seferinde 0.2s bekler. + """ + for _ in range(10): + if self.kilitle(): + try: + with open(self.fname, "a") as f: + f.write(text) + finally: + self.kilit_ac() + return True + time.sleep(0.2) + return False + + +# --------------------------------------------------------------------------- +# Modül test / örnek kullanım +# --------------------------------------------------------------------------- +if __name__ == "__main__": + # Basit smoke-test + test_ini = "test_config.ini" + cfg = EdmConfig(test_ini) + + # Birkaç değer dene + port = cfg.item("serial", "ttyUSB0", "/dev/ttyUSB0") + mode = cfg.item("general", "mode", "auto") + print("serial.ttyUSB0 =", port) + print("general.mode =", mode) + + # KilitliDosya testi + log = KilitliDosya("test_log.txt") + log.yaz("Config_ini self test OK\n") diff --git a/ebuild/io/dbtext.py b/ebuild/io/dbtext.py new file mode 100644 index 0000000..35118c1 --- /dev/null +++ b/ebuild/io/dbtext.py @@ -0,0 +1,338 @@ +# -*- coding: utf-8 -*- +__title__ = "dbtext" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Sensör ve röle olaylarını metin tabanlı SQL log olarak saklayan yardımcı sınıf" +__version__ = "0.2.0" +__date__ = "2025-11-20" + +""" +ebuild/io/dbtext.py + +Revision : 2025-11-20 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +Her sensör ve rölenin: + - Ne zaman açıldığı / kapandığı + - Hangi değeri ürettiği + - Hangi kaynaktan geldiği + +bilgisini tarih-saat bazlı olarak düz bir metin dosyasında tutmak. + +Kayıt formatı (satır başına bir olay): + INSERT INTO (ts, app, source, event_type, value, unit, extra) + VALUES ('YYYY-MM-DD HH:MM:SS', 'APP', 'SOURCE', 'EVENT', VALUE, 'UNIT', 'EXTRA'); + +Örnek: + INSERT INTO ebrulor_log (ts, app, source, event_type, value, unit, extra) + VALUES ('2025-11-20 12:34:56', 'ESYSTEM', 'relay:circulation_a', 'state', 1, 'bool', 'on'); + +Böylece: + - Dosya istenirse direkt PostgreSQL'e pipe edilip çalıştırılabilir + - Aynı zamanda bu modül basit bir parser ile geri okunabilir +""" + +#from __future__ import annotations + +import os +import datetime as _dt +import re +from typing import List, Optional, Dict, Any + +from .config_ini import KilitliDosya + + +class DBText: + """ Metin tabanlı SQL log dosyası için yardımcı sınıf. + + Parametreler + ----------- + filename : str + Log dosyasının yolu (örnek: "ebina_log.sql"). + table : str + SQL INSERT komutlarında kullanılacak tablo adı. + app : str + Uygulama adı (örn. "ESYSTEM"). + use_lock : bool + True ise yazarken KilitliDosya kullanılır (çoklu süreç için daha güvenli). + """ + + def __init__( + self, + filename: str, + table: str = "ebrulor_log", + app: str = "EBUILD", + use_lock: bool = True, + ) -> None: + self.filename = filename + self.table = table + self.app = app + self.use_lock = use_lock + + # Dosya yoksa basit bir header ile oluştur + if not os.path.isfile(self.filename): + with open(self.filename, "w", encoding="utf-8") as f: + f.write(f"-- DBText log file for table {self.table}\n") + f.write(f"-- created at {_dt.datetime.now().isoformat()}\n\n") + + self._locker = KilitliDosya(self.filename) if use_lock else None + + # SQL satırlarını parse etmek için basit regex + self._re_values = re.compile( + r"VALUES \('(?P[^']*)',\s*'(?P[^']*)',\s*'(?P[^']*)',\s*" + r"'(?P[^']*)',\s*(?PNULL|[-0-9.]+),\s*(?PNULL|'[^']*'),\s*" + r"'(?P[^']*)'\);" + ) + + # ------------------------------------------------- + # Yardımcılar + # ------------------------------------------------- + @staticmethod + def _escape(value: str) -> str: + """SQL için tek tırnak kaçışı yapar.""" + return value.replace("'", "''") + + def _write_line(self, line: str) -> None: + """ Tek bir satırı log dosyasına yazar. + + use_lock=True ise KilitliDosya üzerinden, değilse doğrudan append. + """ + if self.use_lock and self._locker is not None: + self._locker.yaz(line + "\n") + else: + with open(self.filename, "a", encoding="utf-8") as f: + f.write(line + "\n") + + # ------------------------------------------------- + # Genel amaçlı event yazma + # ------------------------------------------------- + def insert_event( + self, + source: str, + event_type: str, + value: Optional[float] = None, + unit: Optional[str] = None, + timestamp: Optional[_dt.datetime] = None, + extra: str = "", + ) -> None: + """ Genel amaçlı bir olay kaydı ekler. + + Örnek kullanım: + logger.insert_event( + source="Sensor:28-00000660e983", + event_type="temperature", + value=23.5, + unit="°C", + timestamp=datetime.now(), + extra="Daire 2 Kat 1 Yön 5", + ) + """ + ts = timestamp or _dt.datetime.now() + ts_str = ts.strftime("%Y-%m-%d %H:%M:%S") + + # Değerler + v_str = "NULL" if value is None else f"{float(value):.3f}" + u_str = "NULL" if unit is None else f"'{self._escape(str(unit))}'" + extra_str = self._escape(extra or "") + + src_str = self._escape(source) + etype_str = self._escape(event_type) + app_str = self._escape(self.app) + + line = ( + f"INSERT INTO {self.table} (ts, app, source, event_type, value, unit, extra) " + f"VALUES ('{ts_str}', '{app_str}', '{src_str}', '{etype_str}', {v_str}, {u_str}, '{extra_str}');" + ) + + self._write_line(line) + + # ------------------------------------------------- + # Sensör / röle özel kısayol metotları + # ------------------------------------------------- + def log_state_change( + self, + device_kind: str, + name: str, + is_on: bool, + timestamp: Optional[_dt.datetime] = None, + extra: str = "", + ) -> None: + """ Röle / dijital çıkış / giriş gibi ON/OFF durumlarını loglar. + + device_kind : "relay", "sensor", "pump" vb. + name : cihaz ismi ("circulation_a", "burner_contactor" vb.) + is_on : True → 1 (on), False → 0 (off) + + Event: + source = f"{device_kind}:{name}" + event_type = "state" + value = 1.0 / 0.0 + unit = "bool" + """ + source = f"{device_kind}:{name}" + val = 1.0 if is_on else 0.0 + ex = extra or ("on" if is_on else "off") + + self.insert_event( + source=source, + event_type="state", + value=val, + unit="bool", + timestamp=timestamp, + extra=ex, + ) + + def log_sensor_value( + self, + name: str, + value: float, + unit: str = "", + timestamp: Optional[_dt.datetime] = None, + extra: str = "", + ) -> None: + """ Analog / sayısal sensör değerlerini loglar. + + Örnek: + logger.log_sensor_value("outside_temp", 12.3, "°C") + """ + source = f"sensor:{name}" + self.insert_event( + source=source, + event_type="measurement", + value=value, + unit=unit, + timestamp=timestamp, + extra=extra, + ) + + # ------------------------------------------------- + # Okuma API'si + # ------------------------------------------------- + def _parse_line(self, line: str) -> Optional[Dict[str, Any]]: + """ Tek bir INSERT satırını dict'e çevirir. + + Beklenen format: + INSERT INTO
(...) VALUES ('ts', 'app', 'source', 'etype', value, unit, 'extra'); + """ + line = line.strip() + if not line or not line.upper().startswith("INSERT INTO"): + return None + + m = self._re_values.search(line) + if not m: + return None + + gd = m.groupdict() + ts_str = gd.get("ts", "") + try: + ts = _dt.datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S") + except Exception: + ts = None + + # value + raw_v = gd.get("value", "NULL") + if raw_v == "NULL": + value = None + else: + try: + value = float(raw_v) + except Exception: + value = None + + # unit + raw_u = gd.get("unit", "NULL") + if raw_u == "NULL": + unit = None + else: + # 'C' şeklindeki stringten tek tırnakları atıyoruz + unit = raw_u.strip("'") + + return { + "ts": ts, + "app": gd.get("app", ""), + "source": gd.get("source", ""), + "event_type": gd.get("etype", ""), + "value": value, + "unit": unit, + "extra": gd.get("extra", ""), + } + + def iter_events( + self, + source: Optional[str] = None, + event_type: Optional[str] = None, + since: Optional[_dt.datetime] = None, + until: Optional[_dt.datetime] = None, + ): + """ Log dosyasındaki olayları satır satır okur ve filtre uygular. + + Parametreler: + source : None veya tam eşleşen source string + event_type : None veya tam eşleşen event_type + since : None veya bu tarihten SONRAKİ kayıtlar + until : None veya bu tarihten ÖNCEKİ kayıtlar + + Yield: + dict: {ts, app, source, event_type, value, unit, extra} + """ + if not os.path.isfile(self.filename): + return + + with open(self.filename, "r", encoding="utf-8") as f: + for line in f: + rec = self._parse_line(line) + if not rec: + continue + + ts = rec["ts"] + if since and ts and ts < since: + continue + if until and ts and ts > until: + continue + if source and rec["source"] != source: + continue + if event_type and rec["event_type"] != event_type: + continue + + yield rec + + def get_state_history( + self, + device_kind: str, + name: str, + limit: int = 100, + since: Optional[_dt.datetime] = None, + until: Optional[_dt.datetime] = None, + ) -> List[Dict[str, Any]]: + """ Belirli bir cihazın (sensör / röle) son durum değişikliklerini döndürür. + + device_kind : "relay", "sensor", "pump" vb. + name : cihaz adı + limit : maksimum kaç kayıt döneceği (en yeni kayıtlar) + """ + src = f"{device_kind}:{name}" + events = list(self.iter_events( + source=src, + event_type="state", + since=since, + until=until, + )) + + # En yeni kayıtlar sondadır; tersten limit al + events.sort(key=lambda r: (r["ts"] or _dt.datetime.min), reverse=True) + return events[:limit] + + +if __name__ == "__main__": + # Basit self-test + logger = DBText(filename="test_dbtext_log.sql", table="ebrulor_log", app="ESYSTEM") + + now = _dt.datetime.now() + logger.log_state_change("relay", "circulation_a", True, timestamp=now, extra="manual test on") + logger.log_state_change("relay", "circulation_a", False, timestamp=now + _dt.timedelta(seconds=10), extra="manual test off") + + print("Son durum değişiklikleri:") + history = logger.get_state_history("relay", "circulation_a", limit=10) + for h in history: + print(h) diff --git a/ebuild/io/ds18b20.py b/ebuild/io/ds18b20.py new file mode 100644 index 0000000..396f9dd --- /dev/null +++ b/ebuild/io/ds18b20.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "ds18b20" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "DS18B20 1-Wire sıcaklık sensörü sürücüsü" +__version__ = "0.1.0" +__date__ = "2025-11-21" + +""" +ebuild/io/ds18b20.py + +Revision : 2025-11-21 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- DS18B20 sensörlerini 1-Wire üzerinden /sys/bus/w1/devices yolundan okuyarak + sıcaklık (°C) bilgisi sağlamak. +- Tek sensör için DS18B20Sensor sınıfı, +- Otomatik cihaz keşfi için DS18B20Bus yardımcı sınıfı sunar. + +Notlar +------ +- 1-Wire kernel modüllerinin (w1_gpio, w1_therm) yüklü olması gerekir. +- Bu sürücü yalnızca dosya sisteminden okuma yapar; filtreleme, smoothing, + bina/daire eşlemesi gibi işlemler üst katmanlarda yapılır. +""" + +import glob +import os +from typing import Dict, List, Optional + + +class DS18B20Sensor: + """ + Tek bir DS18B20 sensörünü temsil eder. + + Özellikler: + ----------- + - serial : 1-Wire cihaz id'si (örn: "28-00000660e983") + - base_path : /sys/bus/w1/devices (varsayılan) + - read_temperature() : son sıcaklığı °C cinsinden döndürür + """ + + def __init__( + self, + serial: str, + base_path: str = "/sys/bus/w1/devices", + name: Optional[str] = None, + ) -> None: + self.serial = serial + self.base_path = base_path + self.device_path = os.path.join(base_path, serial, "w1_slave") + self.name = name or serial + + self.is_connected: bool = True + self.error_count: int = 0 + + self.last_temperature: Optional[float] = None + + # ------------------------------------------------------------------ + def read_temperature(self) -> Optional[float]: + """ + Sensörden anlık sıcaklık okur (°C). + + Dönüş: + - Başarı: float (örn: 23.437) + - Hata: None (error_count artar, is_connected False olur) + """ + try: + with open(self.device_path, "r") as f: + lines = f.readlines() + + if not lines: + raise IOError("w1_slave boş okundu") + + # İlk satır CRC ve 'YES/NO' bilgisini içerir. + if not lines[0].strip().endswith("YES"): + raise IOError("CRC hatalı veya sensör doğrulanamadı") + + # İkinci satırda 't=xxxxx' ifadesini arıyoruz. + pos = lines[1].find("t=") + if pos == -1: + raise ValueError("t= alanı bulunamadı") + + raw = lines[1][pos + 2 :].strip() + t_c = float(raw) / 1000.0 + + self.is_connected = True + self.last_temperature = t_c + return t_c + + except Exception: + self.error_count += 1 + self.is_connected = False + self.last_temperature = None + return None + + # ------------------------------------------------------------------ + def exists(self) -> bool: + """ + Cihaz dosyasının mevcut olup olmadığını kontrol eder. + """ + return os.path.exists(self.device_path) + + def summary(self) -> str: + """ + Sensör hakkında kısa bir özet döndürür. + """ + status = "OK" if self.is_connected else "ERR" + return f"DS18B20Sensor(name={self.name}, serial={self.serial}, status={status}, errors={self.error_count})" + + +class DS18B20Bus: + """ + Bir 1-Wire hattı üzerindeki DS18B20 cihazlarını keşfetmek için yardımcı sınıf. + """ + + def __init__(self, base_path: str = "/sys/bus/w1/devices") -> None: + self.base_path = base_path + + def discover(self) -> List[str]: + """ + Sistemdeki tüm DS18B20 cihazlarının seri numaralarını listeler. + Örnek: + ["28-00000660e983", "28-0000066144f9", ...] + """ + pattern = os.path.join(self.base_path, "28-*") + devices = glob.glob(pattern) + serials = [os.path.basename(p) for p in devices] + return serials + + def get_sensors(self) -> Dict[str, DS18B20Sensor]: + """ + Otomatik keşif yaparak her seri için bir DS18B20Sensor nesnesi döndürür. + """ + result: Dict[str, DS18B20Sensor] = {} + for serial in self.discover(): + result[serial] = DS18B20Sensor(serial=serial, base_path=self.base_path) + return result + + +# ---------------------------------------------------------------------- +# Basit test +# ---------------------------------------------------------------------- +if __name__ == "__main__": + bus = DS18B20Bus() + serials = bus.discover() + print("Bulunan DS18B20 cihazları:") + for s in serials: + print(" -", s) + + sensors = bus.get_sensors() + for serial, sensor in sensors.items(): + t = sensor.read_temperature() + print(f"{serial}: {t} °C ({sensor.summary()})") + diff --git a/ebuild/io/edm_db.py b/ebuild/io/edm_db.py new file mode 100644 index 0000000..8591fd1 --- /dev/null +++ b/ebuild/io/edm_db.py @@ -0,0 +1,454 @@ +# -*- coding: utf-8 -*- +__title__ = "edm_db" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "PostgreSQL'e EDM tarzı veri yazan yardımcı sınıf" +__version__ = "0.2.0" +__date__ = "2025-11-20" + +""" +edm_db.py + +Revision : 2025-11-20 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +Eski Rasp2 tabanlı sistemin PostgreSQL'e veri yazma işlerini üstlenen +yardımcı sınıfın (EdmDB) temizlenmiş, hatalardan arındırılmış ve +okunabilirliği artırılmış sürümü. + +Özellikler +---------- +- Veritabanı bağlantı parametrelerini edmConfig.conf içinden okur + (section: [database] varsayımıyla). +- Bağlantıyı (opsiyonel olarak) açar; bağlantı yoksa fonksiyonlar + sessizce False döndürebilir veya sadece log dosyasına SQL basabilir. +- Eski koddaki ana fonksiyonlar korunmuştur: + - db_exec() + - avg_head() + - db_write_861(), db_write_861_data(), db_write() + - Diğer SELECT/UPDATE fonksiyonları (read_0861_order, write_0861_order, ...) + +Not +--- +Aşağıdaki kodda bazı yerlerde güvenlik açısından tavsiye edilen +`parametrized query` kullanımı yerine eski string formatlama +kullanılmıştır; bu modül legacy uyumluluk öncelikli olduğu için +bu haliyle korunmuştur. +""" + +import psycopg2 as psql +from datetime import datetime + +import edmConfig # Senin eski EdmConfig modülün (conf içinde EdmConfig örneği bekliyoruz) + + +class EdmDB: + """ + EDM veritabanı yardımcı sınıfı. + + - Bağlantı parametrelerini edmConfig.conf üzerinden okur. + Örn. config.ini içinde: + + [database] + tcpip = 10.10.2.44 + database = edm_10094 + user = root + password = system + port = 5432 + + - db_exec() ile self.sql içinde tutulan komutu çalıştırır. + """ + + def __init__(self, ini_name: str = "database", auto_connect: bool = False): + """ + ini_name: config.ini içindeki section ismi (varsayılan: [database]) + auto_connect: True verilirse __init__ sırasında PostgreSQL bağlantısı açmayı dener. + """ + self.conf = edmConfig.conf + self.sql = "" + + # Bağlantı parametrelerini INI'den okuyoruz + self.w_ip = self.conf.item(ini_name, "tcpip") # host + self.w_db = self.conf.item(ini_name, "database") # db name + self.w_us = self.conf.item(ini_name, "user") # user + self.w_pw = self.conf.item(ini_name, "password") # password + self.w_pt = self.conf.item(ini_name, "port") # port (string) + + self.con = None + + if auto_connect: + self.connect() + + # ------------------------------------------------- + # Bağlantı yönetimi + # ------------------------------------------------- + def connect(self) -> bool: + """ + PostgreSQL bağlantısını açar. + Başarılıysa True, hata olursa False döner. + """ + try: + self.con = psql.connect( + host=self.w_ip, + user=self.w_us, + password=self.w_pw, + database=self.w_db, + port=int(self.w_pt), + ) + self.con.autocommit = True + # print("EdmDB: connection ok") # İstersen açarsın + return True + except Exception as ex: + print("EdmDB: connection error:", ex) + self.con = None + return False + + def close(self) -> None: + """Veritabanı bağlantısını kapatır.""" + if self.con is not None: + try: + self.con.close() + except Exception: + pass + finally: + self.con = None + + # ------------------------------------------------- + # Temel SQL yürütme + # ------------------------------------------------- + def db_exec(self) -> bool: + """ + self.sql değişkeninde tutulan komutu çalıştırır. + + Bağlantı yoksa: + - Şimdilik sadece True döndürüyoruz (test amaçlı). + Bağlantı varsa: + - execute + commit, hata varsa False döner. + """ + if not self.sql: + return True + + if self.con is None: + # Bağlantı yok; legacy davranışa yakın olması için + # burada True döndürüp sadece SQL'i debug amaçlı yazabilirsin. + # print("EdmDB: no connection, sql skipped:", self.sql) + return True + + try: + with self.con.cursor() as cr: + cr.execute(self.sql) + return True + except Exception as ex: + print("EdmDB.db_exec ERROR:", ex) + return False + + # ------------------------------------------------- + # Örnek veri okuma fonksiyonu + # ------------------------------------------------- + def avg_head(self): + """ + AVG_HEAT_OUTSIDE tablosundan örnek bir kayıt okur. + + Dönüş: + [avg, max, min, saat] şeklinde liste + Eğer okuma yapılamazsa: + [-9990.0, -9999.0, -9999.0, -99] + """ + avg_heat = [-9990.0, -9999.0, -9999.0, -99] + + if self.con is None: + return avg_heat + + try: + sql = "SELECT avgr, maxr, minr, saatr FROM AVG_HEAT_OUTSIDE WHERE saatr = 2;" + with self.con.cursor() as cr: + cr.execute(sql) + row = cr.fetchone() + if row: + avg_heat[0] = row[0] + avg_heat[1] = row[1] + avg_heat[2] = row[2] + avg_heat[3] = row[3] + except Exception as ex: + print("EdmDB.avg_head ERROR:", ex) + + return avg_heat + + # ------------------------------------------------- + # Eski sistem fonksiyonları (istatistik / görev takibi) + # ------------------------------------------------- + def old_datas(self): + """ + edm_0861_data_brulor_percent tablosundan eski verileri okur. + """ + if self.con is None: + return [] + + sql = "SELECT endusuk, enfazla, toplam_harcama, toplam_sure, oran FROM public.edm_0861_data_brulor_percent" + try: + with self.con.cursor() as cr: + cr.execute(sql) + return cr.fetchall() + except Exception as ex: + print("EdmDB.old_datas ERROR:", ex) + return [] + + def old_values(self): + """ + edm_0861_data_start_stop_brulor tablosundan, bugüne ait bazı + start/stop verilerini okur. + """ + if self.con is None: + return [] + + sql = ( + "SELECT createdate, prev_createdate, elpsetime " + "FROM edm_0861_data_start_stop_brulor " + "WHERE createdate > current_date " + "AND sensor_value = 1 " + "ORDER BY 1" + ) + try: + with self.con.cursor() as cr: + cr.execute(sql) + return cr.fetchall() + except Exception as ex: + print("EdmDB.old_values ERROR:", ex) + return [] + + def read_0861_order(self, xfunc_group="0", xfunc_sub_item="0"): + """ + edm_0861_orders tablosundan çalışmaya hazır (exec_status=0) kayıtları okur. + """ + if self.con is None: + return [] + + sql = ( + "SELECT exec_status, uniqueid, func_group, func_sub_item, roleid, " + " work_minute, param_count, startdate, stopdate, " + " (work_minute * 4) - 0 = param_count as mstatus " + "FROM public.edm_0861_orders " + "WHERE exec_status = 0 " + " AND licenseid = 10094 " + " AND activeid = true " + " AND func_group = '%s' " + " AND current_timestamp < stopdate " + " AND startdate < current_timestamp " + " AND func_sub_item = '%s' " + "ORDER BY startdate;" + ) % (xfunc_group, xfunc_sub_item) + + try: + with self.con.cursor() as cr: + cr.execute(sql) + return cr.fetchall() + except Exception as ex: + print("EdmDB.read_0861_order ERROR:", ex) + return [] + + def write_0861_order(self, uid): + """ + edm_0861_orders tablosunda param_count değerini 1 artırır. + """ + if self.con is None: + return + + sql = ( + "UPDATE public.edm_0861_orders " + "SET param_count = param_count + 1 " + "WHERE exec_status = 0 " + " AND licenseid = 10094 " + " AND activeid = true " + " AND uniqueid = '%s' " + " AND param_count < (work_minute * 4) " + " AND current_timestamp < stopdate;" + ) % uid + + try: + with self.con.cursor() as cr: + cr.execute(sql) + except Exception as ex: + print("EdmDB.write_0861_order ERROR:", ex) + + def close_0861_order(self, uid): + """ + Belirli bir order'ı exec_status=5 yaparak kapatır. + """ + if self.con is None: + return + + sql = ( + "UPDATE public.edm_0861_orders " + "SET exec_status = 5, stopdate = current_timestamp " + "WHERE exec_status = 0 " + " AND licenseid = 10094 " + " AND activeid = true " + " AND uniqueid = '%s';" + ) % uid + + try: + with self.con.cursor() as cr: + cr.execute(sql) + except Exception as ex: + print("EdmDB.close_0861_order ERROR:", ex) + + def update_0861_order(self, uid): + """ + Verilen uniqueid için startdate/stopdate'i günceller ve + yeni startdate'i döndürür. + """ + if self.con is None: + return None + + try: + sql = ( + "UPDATE public.edm_0861_orders " + "SET startdate = current_timestamp, " + " stopdate = current_timestamp + INTERVAL '2 day' " + "WHERE exec_status = 0 AND uniqueid = %d" + ) % int(uid) + + with self.con.cursor() as cr: + cr.execute(sql) + + sql = ( + "SELECT startdate as mstatus " + "FROM public.edm_0861_orders " + "WHERE exec_status = 0 AND uniqueid = %d" + ) % int(uid) + + with self.con.cursor() as cr: + cr.execute(sql) + rows = cr.fetchall() + + for row in rows: + return row[0] + except Exception as ex: + print("EdmDB.update_0861_order ERROR:", ex) + + return None + + # ------------------------------------------------- + # 0861 / 0861_data yazma fonksiyonları + # ------------------------------------------------- + def db_write_861(self, licenseid, siteid, locationid, device_group, device_code, device_value): + """ + edm_0861 tablosuna temel bir kayıt ekler. + + NOT: device_value burada sadece varlık için kullanılıyor; + asıl anlık değerler 0861_data tablosuna yazılıyor. + """ + self.sql = ( + "INSERT INTO public.edm_0861(" + "licenseid, siteid, locationid, hardware_type, " + "hardware_model_code, hardwareuniquecode, " + "hardwarejobcode, hardwarecomment, jobcode" + ") VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')" + ) % ( + licenseid, + siteid, + locationid, + "D", # hardware_type + device_group, # hardware_model_code + device_code, # hardwareuniquecode + device_code, # hardwarejobcode + device_code, # hardwarecomment + device_code, # jobcode + ) + + if self.db_exec(): + return True + return False + + def get_edm_0861(self, licenseid, siteid, locationid, device_code): + """ + İlgili cihaz için aktif edm_0861 kaydının uniqueid'sini döndürür. + Bağlantı yoksa veya kayıt bulunamazsa 0 döner. + + NOT: Eski koddaki "yoksa oluştur sonra tekrar ara" davranışı + burada yorum satırı olarak bırakıldı; istersen geri açarsın. + """ + if self.con is None: + return 0 + + sql = ( + "SELECT uniqueid " + "FROM public.edm_0861 " + "WHERE licenseid = '%s' " + " AND siteid = '%s' " + " AND locationid = '%s' " + " AND NOW() BETWEEN startdate AND stopdate " + " AND activeid = True " + " AND deleteid = False " + " AND hardwarejobcode = '%s'" + ) % (licenseid, siteid, locationid, device_code) + + try: + with self.con.cursor() as cr: + cr.execute(sql) + rows = cr.fetchall() + for row in rows: + return row[0] + except Exception as ex: + print("EdmDB.get_edm_0861 ERROR:", ex) + + # Eski davranış: kayıt yoksa oluşturmayı denerdi. + # İstersen buraya geri koyabilirsin. + return 0 + + def db_write_861_data(self, licenseid, siteid, locationid, device_group, device_code, device_value): + """ + edm_0861_data tablosuna cihaz verisi (sensor_value) yazar. + Bağlantı yoksa SQL'i LOG_device_group.log dosyasına basar. + """ + xdevice_code = "%s" % (device_code) + device_str = "" + + # Değer tipini normalize et + if isinstance(device_value, (float, int)): + numeric_value = float(device_value) + else: + device_str = str(device_value) + numeric_value = 0.0 + + self.sql = ( + "INSERT INTO public.edm_0861_data(" + "licenseid, uniqueid, sensor_value, init_value" + ") VALUES ('%s','%s','%f','%s')" + ) % (licenseid, xdevice_code, numeric_value, 0) + + # LOG_DEVICEGROUP.log dosyasına da yaz + fname = "LOG_%s.log" % (device_group) + fsql = "%s:%s\n" % (datetime.now(), self.sql) + try: + with open(fname, "a") as file_object: + file_object.write(fsql) + except Exception as ex: + print("EdmDB.db_write_861_data LOG ERROR:", ex) + + if self.db_exec(): + return True + + # DB yazılamadıysa, fallback olarak edm_0861 kaydı oluşturmaya çalış + return self.db_write_861(licenseid, siteid, locationid, device_group, device_code, device_value) + + def db_write(self, licenseid, siteid, locationid, device_group, device_code, device_value): + """ + 0861_data'ya yazmayı 3 kez dener. + Hata alma durumunda db_write_861_data içindeki fallback devreye girer. + """ + result = False + i = 0 + while not result and i < 3: + i += 1 + result = self.db_write_861_data( + licenseid, siteid, locationid, + device_group, device_code, device_value + ) + + +if __name__ == "__main__": + # Basit bir smoke-test + db = EdmDB(auto_connect=False) # Bağlanmadan da oluşturulabilir + print("EdmDB instance created. Host:", db.w_ip, "DB:", db.w_db) diff --git a/ebuild/io/legacy_syslog.py b/ebuild/io/legacy_syslog.py new file mode 100644 index 0000000..e86d9fc --- /dev/null +++ b/ebuild/io/legacy_syslog.py @@ -0,0 +1,453 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "legacy_syslog" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Legacy tarzı syslog çıktısı üreten köprü" +__version__ = "0.2.1" +__date__ = "2025-11-22" + +""" +ebuild/io/legacy_syslog.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- Eski /brulor.py'nin syslog formatına yakın satırlar üretmek. +- Python logging + SysLogHandler kullanarak: + program adı: BRULOR + mesaj : "[ 1 .... ]" formatında + +Bu modül: +- send_legacy_syslog(message) → tek satır yazar +- emit_top_block(now, SeasonController) → + 1) versiyon satırı + 2) güneş (sunrise/sunset) + sistem/licence + 3) mevsim + bahar dönemi + tatil satırları +- log_burner_header(...) → BurnerController.tick() için üst blok + + sistem ısı + motor bilgilerini basar. +""" + +from datetime import datetime, time, timedelta, date +from typing import Optional + +import logging +import logging.handlers + +try: + # SeasonController ve konfig + from ..core.season import SeasonController + from .. import config_statics as cfg + from .. import config_runtime as cfg_v +except ImportError: # test / standalone + SeasonController = None # type: ignore + cfg = None # type: ignore + cfg_v = None # type: ignore + + +# ---------------------------------------------------------------------- +# Logger kurulumu (Syslog + stdout) +# ---------------------------------------------------------------------- +_LOGGER: Optional[logging.Logger] = None + + +def _get_logger() -> logging.Logger: + global _LOGGER + if _LOGGER is not None: + return _LOGGER + + logger = logging.getLogger("BRULOR") + logger.setLevel(logging.INFO) + + # Aynı handler'ları ikinci kez eklemeyelim + if not logger.handlers: + # Syslog handler (Linux: /dev/log) + try: + syslog_handler = logging.handlers.SysLogHandler(address="/dev/log") + # Syslog mesaj formatı: "BRULOR: [ 1 ... ]" + fmt = logging.Formatter("%(name)s: %(message)s") + syslog_handler.setFormatter(fmt) + logger.addHandler(syslog_handler) + except Exception: + # /dev/log yoksa sessizce geç; sadece stdout'a yazacağız + pass + + # Konsol çıktısı (debug için) + stream_handler = logging.StreamHandler() + stream_fmt = logging.Formatter("INFO:BRULOR:%(message)s") + stream_handler.setFormatter(stream_fmt) + logger.addHandler(stream_handler) + + _LOGGER = logger + return logger + + +# ---------------------------------------------------------------------- +# Temel çıktı fonksiyonları +# ---------------------------------------------------------------------- +def send_legacy_syslog(message: str) -> None: + """ + Verilen mesajı legacy syslog formatına uygun şekilde ilgili hedefe gönderir. + - Syslog (/dev/log) → program adı: BRULOR + - Aynı zamanda stdout'a da yazar (DEBUG amaçlı) + """ + try: + logger = _get_logger() + logger.info(message) + except Exception as e: + # Logger bir sebeple çökerse bile BRULOR satırını kaybetmeyelim + print("BRULOR:", message, f"(logger error: {e})") + + +def format_line(line_no: int, body: str) -> str: + """ + BRULOR satırını klasik formata göre hazırlar. + + Örnek: + line_no = 2, body = "Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094" + + "[ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094]" + + Not: + Burada "BRULOR" yazmıyoruz; syslog program adı zaten BRULOR olacak. + """ + return f"[{line_no:3d} {body}]" + + +def _format_version_3part(ver: str) -> str: + """ + __version__ string'ini "00.02.01" formatına çevirir. + Örnek: + "0.2.1" → "00.02.01" + """ + parts = (ver or "").split(".") + nums = [] + for p in parts: + try: + nums.append(int(p)) + except ValueError: + nums.append(0) + while len(nums) < 3: + nums.append(0) + return f"{nums[0]:02d}.{nums[1]:02d}.{nums[2]:02d}" + + +# ---------------------------------------------------------------------- +# Üst blok: versiyon + güneş + mevsim + tatil +# ---------------------------------------------------------------------- +def emit_header_version(line_no: int, now: datetime) -> int: + """ + 1. satır: Versiyon ve zaman bilgisi. + + Örnek: + [ 1 ************** 00.02.01 2025-11-22 22:20:19 *************] + """ + ver = _format_version_3part(__version__) + ts = now.strftime("%Y-%m-%d %H:%M:%S") + body = f"************** {ver} {ts} *************" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def emit_header_sunrise_sunset( + line_no: int, + sunrise: Optional[time], + sunset: Optional[time], + system_on: bool, + licence_id: int, +) -> int: + """ + 2. satır: Güneş bilgisi + Sistem On/Off + Lisans id. + + Örnek: + [ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094] + """ + sun_str = "" + if sunrise is not None: + sun_str += f"Sunrise:{sunrise.strftime('%H:%M')} " + if sunset is not None: + sun_str += f"Sunset:{sunset.strftime('%H:%M')} " + + sys_str = "On" if system_on else "Off" + body = f"{sun_str}Sistem: {sys_str} Lic:{licence_id}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def _normalize_iso_date(s: Optional[str]) -> str: + """ + SeasonInfo.season_start / season_end alanlarını sadeleştirir. + + Örn: '2025-09-23T16:33:10.687982+03:00' → '2025-09-23' + """ + if not s: + return "--" + s = s.strip() + if "T" in s: + return s.split("T", 1)[0] + return s + + +def emit_header_season( + line_no: int, + season_ctrl: SeasonController, +) -> int: + """ + Sunrise satırının altına mevsim + (varsa) bahar tasarruf dönemi satırını basar. + + Beklenen format: + + BRULOR [ 3 season : Sonbahar 2025-09-23 - 2025-12-20 [89 pass:60 kalan:28] ] + BRULOR [ 4 bahar : 2025-09-23 - 2025-10-13 ] + + Notlar: + - Bilgiler SeasonController.info içinden okunur (dict veya obje olabilir). + - bahar_tasarruf True DEĞİLSE bahar satırı hiç basılmaz. + """ + + if season_ctrl is None: + return line_no + + info = getattr(season_ctrl, "info", None) + if info is None: + return line_no + + # dataclass benzeri objeden alanları çek + season = getattr(info, "season", "Unknown") + s_start = _normalize_iso_date(getattr(info, "season_start", "")) + s_end = _normalize_iso_date(getattr(info, "season_end", "")) + s_day = int(getattr(info, "season_day", 0) or 0) + s_pass = int(getattr(info, "season_passed", 0) or 0) + s_rem = int(getattr(info, "season_remaining", 0) or 0) + + body = ( + f"season : {season} {s_start} - {s_end} " + f"[{s_day} pass:{s_pass} kalan:{s_rem}]" + ) + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # Bahar / tasarruf dönemi bilgileri + is_season = bool(getattr(info, "is_season", False)) + saving_start = getattr(info, "saving_start", None) + saving_stop = getattr(info, "saving_stop", None) + + if is_season and isinstance(saving_start, date) and isinstance(saving_stop, date): + # Kullanıcı isteği: öncesi/sonrası 3'er gün göster + show_start = saving_start - timedelta(days=3) + show_stop = saving_stop + timedelta(days=3) + body = ( + f"bahar : {show_start.isoformat()} - {show_stop.isoformat()}" + ) + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # Eğer resmi tatil bilgisi de varsa opsiyonel satır + is_holiday = bool(getattr(info, "is_holiday", False)) + holiday_label = getattr(info, "holiday_label", "") + + if not is_holiday: + return line_no + + label = holiday_label or "" + body = f"Tatil: True Adı: {label}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +# ---------------------------------------------------------------------- +# Dışarıdan çağrılacak üst-blok helper +# ---------------------------------------------------------------------- +def emit_top_block( + now: datetime, + season_ctrl: SeasonController, +) -> int: + """ + F veya B modundan bağımsız olarak, her tick başında üst bilgiyi üretir. + + Sıra: + 1) Versiyon + zaman + 2) Sunrise / Sunset / Sistem: On/Off / Lic + 3) Mevsim bilgisi (SeasonController.to_syslog_lines() → sadeleştirilmiş) + 4) Tatil bilgisi (sadece tatil varsa) + 5) Bir sonraki satır numarasını döndürür (bina ısı satırları için). + """ + line_no = 1 + + # 1) Versiyon + line_no = emit_header_version(line_no, now) + + # Konfigten sistem ve lisans bilgileri + if cfg is not None: + licence_id = int(getattr(cfg, "BUILDING_LICENCEID", 0)) + system_onoff = int(getattr(cfg, "BUILDING_SYSTEMONOFF", 1)) + else: + licence_id = 0 + system_onoff = 1 + + # SeasonController.info'dan sunrise/sunset okumayı dene + sunrise = None + sunset = None + if season_ctrl is not None: + info = getattr(season_ctrl, "info", None) + if info is not None: + sunrise = getattr(info, "sunrise", None) + sunset = getattr(info, "sunset", None) + + line_no = emit_header_sunrise_sunset( + line_no=line_no, + sunrise=sunrise, + sunset=sunset, + system_on=bool(system_onoff), + licence_id=licence_id, + ) + + # Mevsim + bahar dönemi + line_no = emit_header_season(line_no, season_ctrl) + + # Sonraki satır: bina ısı / dış ısı / F-B detayları için kullanılacak + return line_no + + +# ---------------------------------------------------------------------- +# BurnerController entegrasyonu +# ---------------------------------------------------------------------- +def _fmt_c(val: Optional[float]) -> str: + """Dereceyi 'None°C' veya '23.4°C' gibi tek tip formatlar.""" + if val is None: + return "None°C" + try: + return f"{float(val):.2f}°C" + except Exception: + return "None°C" + + +def log_burner_header( + now: datetime, + mode: str, + season, + building_avg: Optional[float], + outside_c: Optional[float], + used_out_c: Optional[float], + fire_sp: float, + burner_on: bool, + pumps_on, +) -> None: + """BurnerController.tick() için tek entry-point. + + Buradan: + 1) Versiyon + güneş + mevsim / bahar / tatil blokları + 2) Bina / sistem ısı bilgisi + 3) Brülör ve devirdaim motor satırları + syslog'a basılır. + """ + # 1) Üst blok + try: + line_no = emit_top_block(now, season) + except Exception as exc: + # Üst blok patlasa bile alttakileri basalım ki log tamamen kaybolmasın + send_legacy_syslog(format_line(1, f"emit_top_block error: {exc}")) + line_no = 2 + + # 2) Bina/sistem ısı satırı + try: + # Çalışma modu: F (dış ısı) / B (bina ort) + cfg_mode = getattr(cfg, "BUILD_BURNER", "F") if cfg is not None else "F" + mode_cfg = str(cfg_mode).upper() + + # Isı limiti (dış ısı limiti) + limit = None + if cfg_v is not None: + try: + limit = float(getattr(cfg_v, "OUTSIDE_HEAT_LIMIT_C", 0.0)) + except Exception: + limit = None + + body = ( + f"Build [{mode}-{mode_cfg}] " + f"Heats[Min:{_fmt_c(None)} Avg:{_fmt_c(building_avg)} Max:{_fmt_c(None)}]" + ) + if limit is not None: + # Son köşeli parantezi atmamak için ufak hack + body = body[:-1] + f" L:{limit:.1f}]" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # Eski formata yakın "Sistem Isı" satırı + w_boost = 0.0 + c_off = 0.0 + if cfg_v is not None: + try: + w_boost = float(getattr(cfg_v, "WEEKEND_HEAT_BOOST_C", 0.0)) + except Exception: + pass + try: + c_off = float(getattr(cfg_v, "BURNER_COMFORT_OFFSET_C", 0.0)) + except Exception: + pass + + body = f"Sistem Isı : {_fmt_c(used_out_c)} [w:{int(w_boost)} c:{int(c_off)}]" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # 3) Brülör motor satırı + br_state = "" if burner_on else "" + br_flag = 1 if burner_on else 0 + body = ( + f"Brulor Motor : {br_state} [{br_flag}] 0 " + f"00:00:00 00:00:00 L:{fire_sp:.1f}" + ) + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # 4) Devirdaim pompa satırı + pumps_on = tuple(pumps_on or ()) + pump_state = "" if pumps_on else "" + pump_flag = 1 if pumps_on else 0 + pump_label = pumps_on[0] if pumps_on else "-" + circ_limit = None + if cfg_v is not None: + try: + circ_limit = float(getattr(cfg_v, "CIRCULATION_MIN_RETURN_C", 25.0)) + except Exception: + circ_limit = None + + if circ_limit is None: + body = ( + f"Devirdaim Mot: {pump_state} [{pump_flag}] 0 " + f"00:00:00 00:00:00 L:{pump_label}" + ) + else: + body = ( + f"Devirdaim Mot: {pump_state} [{pump_flag}] 0 " + f"00:00:00 00:00:00 L:{pump_label} {circ_limit:.1f}" + ) + send_legacy_syslog(format_line(line_no, body)) + except Exception as exc: + # Her türlü hata durumunda sessiz kalmak yerine loga yaz + send_legacy_syslog(format_line(line_no, f"log_burner_header error: {exc}")) + + +# ---------------------------------------------------------------------- +# Örnek kullanım (standalone test) +# ---------------------------------------------------------------------- +if __name__ == "__main__": + # Bu blok sadece modülü tek başına test etmek için: + # python3 -m ebuild.io.legacy_syslog + if SeasonController is None: + raise SystemExit("SeasonController import edilemedi (test ortamı).") + + now = datetime.now() + # SeasonController.from_now() kullanıyorsan: + try: + season = SeasonController.from_now() + except Exception as e: + raise SystemExit(f"SeasonController.from_now() hata: {e}") + + next_line = emit_top_block(now, season) + + # Test için bina ısısını dummy bas: + body = "Bina Isı : [ 20.10 - 22.30 - 24.50 ]" + send_legacy_syslog(format_line(next_line, body)) diff --git a/ebuild/io/relay_driver.py b/ebuild/io/relay_driver.py new file mode 100644 index 0000000..2a9c9ea --- /dev/null +++ b/ebuild/io/relay_driver.py @@ -0,0 +1,376 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "relay_driver" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "GPIO röle sürücüsü + brülör grup soyutlaması" +__version__ = "0.4.0" +__date__ = "2025-11-22" + +""" +ebuild/io/relay_driver.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- Raspberry Pi GPIO üzerinden röle sürmek için basit bir soyutlama. +- Soyut kanal isimleri (ör: "igniter", "circulation_a") → BCM pin eşlemesi + config_statics.RELAY_GPIO üzerinden gelir. +- Brülör grupları için BURNER_GROUPS kullanılır: + + BURNER_GROUPS = { + 0: { + "name": "MainBurner", + "location": "Sol binada", + "igniter_pin": 16, + "circulation": { + "circ_1": {"channel": "circulation_a", "pin": 26, "default": 1}, + "circ_2": {"channel": "circulation_b", "pin": 24, "default": 0}, + }, + }, + ... + } + +Bu modül: +- Tek tek kanal ON/OFF (set_channel) +- Tüm kanalları kapatma (all_off) +- Brülör → igniter kanalını ve pompalarını soyutlayan yardımcılar +- Kanal bazlı basit istatistik (RelayStats) sağlar. +""" + +import time +from dataclasses import dataclass +from typing import Dict, Iterable, List, Optional + +try: + from .. import config_statics as cfg +except ImportError: # test / standalone + cfg = None # type: ignore + +# ---------------------------------------------------------------------- +# GPIO soyutlama (RPi.GPIO yoksa dummy) +# ---------------------------------------------------------------------- +try: + import RPi.GPIO as GPIO # type: ignore + + _HAS_GPIO = True +except Exception: # Raspi dışı ortam + GPIO = None # type: ignore + _HAS_GPIO = False + + +# ---------------------------------------------------------------------- +# İstatistik yapısı +# ---------------------------------------------------------------------- +@dataclass +class RelayStats: + """ + Tek bir röle kanalı için istatistikler. + + - on_count : kaç defa ON'a çekildi + - last_on_ts : en son ON'a çekildiği zaman (epoch saniye) + - last_off_ts : en son OFF olduğu zaman (epoch saniye) + - last_duration_s : en son ON periyodunun süresi (saniye) + - total_on_s : bugüne kadar toplam ON kalma süresi (saniye) + """ + on_count: int = 0 + last_on_ts: Optional[float] = None + last_off_ts: Optional[float] = None + last_duration_s: float = 0.0 + total_on_s: float = 0.0 + + def on(self, now: float) -> None: + """ + Kanal ON'a çekildiğinde çağrılır. + Aynı ON periyodu içinde tekrar çağrılırsa sayaç artmaz. + """ + if self.last_on_ts is None: + self.last_on_ts = now + self.on_count += 1 + + def off(self, now: float) -> None: + """ + Kanal OFF'a çekildiğinde çağrılır. + Son ON zamanına göre süre hesaplanır, last_duration_s ve total_on_s güncellenir. + """ + if self.last_on_ts is not None: + dur = max(0.0, now - self.last_on_ts) + self.last_duration_s = dur + self.total_on_s += dur + self.last_on_ts = None + self.last_off_ts = now + + def current_duration(self, now: Optional[float] = None) -> float: + """ + Kanal şu anda ON ise, bu ON periyodunun şu ana kadarki süresini döndürür. + OFF ise 0.0 döner. + """ + if self.last_on_ts is None: + return 0.0 + if now is None: + now = time.time() + return max(0.0, now - self.last_on_ts) + + +# ---------------------------------------------------------------------- +# Ana sürücü +# ---------------------------------------------------------------------- +class RelayDriver: + """ + Basit bir röle sürücüsü. + + - Soyut kanal isimleri: RELAY_GPIO dict'indeki anahtarlar + - Brülör grup API'si: + * burners() → mevcut brülör id listesi + * burner_info(bid) → config_statics.BURNER_GROUPS[bid] + * igniter_channel(bid) → ateşleme kanal adı + * set_igniter(bid, state) + * set_pump(bid, pump_name, state) + * enabled_pumps(bid) → default=1 olan isimler (konfig default) + * all_pumps(bid) → tüm pompa isimleri + * active_pumps(bid) → şu anda ON olan pompa isimleri + """ + + def __init__(self, onoff: bool = False) -> None: + print("RelayDriver yükleniyor…") + + # Konfigten kanal → GPIO pin map + self._pin_map: Dict[str, int] = dict(getattr(cfg, "RELAY_GPIO", {})) if cfg else {} + + # Her kanal için istatistik objesi + self._stats: Dict[str, RelayStats] = { + ch: RelayStats() for ch in self._pin_map.keys() + } + + # Brülör grupları + self._burner_groups: Dict[int, dict] = dict(getattr(cfg, "BURNER_GROUPS", {})) if cfg else {} + + # GPIO kurulumu + if _HAS_GPIO and self._pin_map: + GPIO.setmode(GPIO.BCM) + for ch, pin in self._pin_map.items(): + GPIO.setup(pin, GPIO.OUT) + # Güvenli başlangıç: tüm kanallar kapalı + GPIO.output(pin, GPIO.LOW) + elif not self._pin_map: + print("⚠️ RELAY_GPIO konfigürasyonu boş; donanım pin eşlemesi yok.") + + # igniter_pin → kanal adı map'ini BURNER_GROUPS içine enjekte et + if self._burner_groups and self._pin_map: + pin_to_channel = {pin: ch for ch, pin in self._pin_map.items()} + for bid, info in self._burner_groups.items(): + if not isinstance(info, dict): + continue + ign_pin = info.get("igniter_pin") + if ign_pin is not None: + ch = pin_to_channel.get(ign_pin) + if ch: + info.setdefault("igniter", ch) + + # İstenirse tüm röleleri açılışta kapat + if onoff is False: + self.all_off() + + # ----------------------------------------------------- + # Düşük seviye kanal kontrolü + # ----------------------------------------------------- + def set_channel(self, channel: str, state: bool) -> None: + """ + Verilen kanal adını ON/OFF yapar. + """ + if channel not in self._pin_map: + # Tanımsız kanal – sessiz geç + return + + pin = self._pin_map[channel] + now = time.time() + + # İstatistik güncelle + st = self._stats.get(channel) + if st is None: + st = RelayStats() + self._stats[channel] = st + + if state: + st.on(now) + else: + st.off(now) + + # Donanım + if _HAS_GPIO: + # Aktif-high röle kartı varsayıyoruz; gerekiyorsa buraya + # ACTIVE_LOW/ACTIVE_HIGH gibi bir bayrak eklenebilir. + GPIO.output(pin, GPIO.HIGH if state else GPIO.LOW) + + def get_stats(self, channel: str) -> RelayStats: + """ + Kanal için istatistik objesini döndürür (yoksa yaratır). + """ + st = self._stats.get(channel) + if st is None: + st = RelayStats() + self._stats[channel] = st + return st + + def get_channel_state(self, channel: str) -> bool: + """ + Kanal şu anda ON mu? (last_on_ts None değilse ON kabul edilir) + """ + st = self._stats.get(channel) + if st is None: + return False + return st.last_on_ts is not None + + # ----------------------------------------------------- + # Tüm kanalları güvenli moda çek + # ----------------------------------------------------- + def all_off(self) -> None: + """ + Tüm kanalları OFF yapar. + """ + now = time.time() + for ch in list(self._pin_map.keys()): + st = self._stats.get(ch) + if st is not None and st.last_on_ts is not None: + st.off(now) + if _HAS_GPIO: + GPIO.output(self._pin_map[ch], GPIO.LOW) + + # ----------------------------------------------------- + # Brülör grup API'si + # ----------------------------------------------------- + def burners(self) -> List[int]: + """ + Mevcut brülör id listesini döndürür. + """ + return sorted(self._burner_groups.keys()) + + def burner_info(self, burner_id: int) -> Optional[dict]: + """ + Verilen brülör id için BURNER_GROUPS kaydını döndürür. + """ + return self._burner_groups.get(burner_id) + + def igniter_channel(self, burner_id: int) -> Optional[str]: + """ + Brülörün igniter kanal adını döndürür. + + - Eğer BURNER_GROUPS kaydında 'igniter' alanı varsa doğrudan onu kullanır. + - Yoksa 'igniter_pin' alanından pin numarasını alır ve + RELAY_GPIO'daki pin → kanal eşlemesini kullanarak kanalı bulur. + """ + info = self.burner_info(burner_id) + if not info: + return None + # BURNER_GROUPS konfiginde igniter_pin veriliyor; bunu kanala çevir. + ch = info.get("igniter") + if ch: + return ch + pin = info.get("igniter_pin") + if pin is None: + return None + # pin → channel eşlemesini RELAY_GPIO'dan bul + for cname, cpin in self._pin_map.items(): + if cpin == pin: + return cname + return None + + def all_pumps(self, burner_id: int) -> Iterable[str]: + """ + Konfigte tanımlı tüm pompa kanal adlarını döndürür (circulation altı). + """ + info = self.burner_info(burner_id) + if not info: + return [] + circ = info.get("circulation", {}) or {} + # circ_x → {channel: "circulation_a", pin: ..} + for logical_name, entry in circ.items(): + ch = entry.get("channel") + if ch: + yield ch + + def enabled_pumps(self, burner_id: int) -> Iterable[str]: + """ + Varsayılan olarak açık olması gereken pompa kanal adlarını döndürür. + (circulation altındaki default=1 kayıtları) + """ + info = self.burner_info(burner_id) + if not info: + return [] + circ = info.get("circulation", {}) or {} + for logical_name, entry in circ.items(): + ch = entry.get("channel") + default = int(entry.get("default", 0)) + if ch and default == 1: + yield ch + + def active_pumps(self, burner_id: int) -> Iterable[str]: + """ + Şu anda ON olan pompa kanal adlarını döndürür. + """ + for ch in self.all_pumps(burner_id): + if self.get_channel_state(ch): + yield ch + + def set_igniter(self, burner_id: int, state: bool) -> None: + """ + İlgili brülörün igniter kanalını ON/OFF yapar. + """ + ch = self.igniter_channel(burner_id) + if ch: + self.set_channel(ch, state) + + def set_pump(self, burner_id: int, pump_name: str, state: bool) -> None: + """ + Belirtilen brülörün belirtilen pompasını ON/OFF yapar. + pump_name: BURNER_GROUPS[..]["circulation"][pump_name] + """ + info = self.burner_info(burner_id) + if not info: + return + circ = info.get("circulation", {}) + if pump_name in circ: + ch = circ[pump_name]["channel"] + self.set_channel(ch, state) + + # ----------------------------------------------------- + # Yardımcı: özet + # ----------------------------------------------------- + def summary(self) -> str: + """ + Kanallar ve brülör gruplarının kısa bir özetini döndürür (debug amaçlı). + """ + lines: List[str] = [] + chans = ", ".join(sorted(self._pin_map.keys())) + lines.append(f"Kanallar: {chans}") + + for bid in self.burners(): + info = self.burner_info(bid) or {} + name = info.get("name", "?") + loc = info.get("location", "?") + ign = self.igniter_channel(bid) + pumps = list(self.all_pumps(bid)) + defaults = list(self.enabled_pumps(bid)) + lines.append( + f" #{bid}: {name} @ {loc} | igniter={ign} | " + f"pumps={pumps} | default_on={defaults}" + ) + return "\n".join(lines) + + # ----------------------------------------------------- + # Temizlik + # ----------------------------------------------------- + def cleanup(self) -> None: + """ + GPIO pinlerini serbest bırakır. + """ + if _HAS_GPIO: + GPIO.cleanup() + + +if __name__ == "__main__": + drv = RelayDriver() + print("\n🧰 RelayDriver Summary") + print(drv.summary()) diff --git a/ebuild/io/sensor_dht11.py b/ebuild/io/sensor_dht11.py new file mode 100644 index 0000000..209b975 --- /dev/null +++ b/ebuild/io/sensor_dht11.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "sensor_dht11" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "DHT11 tabanlı dış ortam sıcaklık / nem sensörü sürücüsü" +__version__ = "0.1.0" +__date__ = "2025-11-21" + +""" +ebuild/io/sensor_dht11.py + +Revision : 2025-11-21 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- DHT11 sensöründen sıcaklık (°C) ve bağıl nem (%) okumak. +- Varsayılan olarak config_statics.DHT11_OUTSIDE_PIN üzerinde çalışır. +- Adafruit_DHT kütüphanesi mevcut değilse veya donanım erişiminde sorun + varsa, mock / güvenli modda çalışarak None veya sabit değerler + döndürür; böylece sistemin geri kalanı göçmez. + +Notlar +------ +- DHT11, tek data pini üzerinden dijital haberleşme kullanır; ADC gerekmez. +- Bu sürücü yalnızca ham okuma yapar. Filtreleme, smoothing, alarm üretimi + gibi üst seviye işlemler Environment/HeatEngine katmanına bırakılır. +""" + +from typing import Optional, Tuple + +try: + import Adafruit_DHT # type: ignore +except ImportError: + Adafruit_DHT = None # type: ignore + +try: + from .. import config_statics as cfg +except ImportError: + cfg = None # type: ignore + + +class DHT11Sensor: + """ + Tek bir DHT11 sensörünü temsil eder. + + Özellikler: + ----------- + - BCM pin numarası (örn: config_statics.DHT11_OUTSIDE_PIN) + - read() ile (temperature_c, humidity_percent) döndürür. + - Donanım veya kütüphane sorunu durumunda mock moda geçer. + """ + + def __init__( + self, + bcm_pin: Optional[int] = None, + sensor_type: int = 11, + name: str = "DHT11_Outside", + ) -> None: + """ + Parametreler: + bcm_pin : BCM pin numarası. None ise configten okunur. + sensor_type: Adafruit_DHT sensör tipi (11 → DHT11). + name : Sensörün mantıksal adı (log / debug için). + """ + if bcm_pin is None and cfg is not None: + bcm_pin = int(getattr(cfg, "DHT11_OUTSIDE_PIN", 5)) + + if bcm_pin is None: + raise ValueError("DHT11Sensor için BCM pin numarası verilmeli veya configte DHT11_OUTSIDE_PIN tanımlı olmalı.") + + self.bcm_pin = int(bcm_pin) + self.sensor_type = sensor_type + self.name = name + + self.mock_mode = Adafruit_DHT is None + + # Son başarı/başarısızlık bilgisi + self.last_temperature: Optional[float] = None + self.last_humidity: Optional[float] = None + self.last_ok: bool = False + + # ------------------------------------------------------------------ + # Okuma + # ------------------------------------------------------------------ + def read(self, retries: int = 3) -> Tuple[Optional[float], Optional[float]]: + """ + Sensörden sıcaklık ve nem okur. + + Dönüş: + (temperature_c, humidity_percent) + + - Başarı durumunda her iki değer de float (örn: 23.4, 45.0) + - Başarısızlıkta (None, None) + - Mock modda -> (None, None) veya ileride sabit test değeri + """ + if self.mock_mode: + # Donanım veya Adafruit_DHT yok → güvenli fallback. + self.last_temperature = None + self.last_humidity = None + self.last_ok = False + return (None, None) + + # Gerçek okuma + temperature: Optional[float] = None + humidity: Optional[float] = None + + for _ in range(retries): + # Adafruit_DHT.read_retry(DHT11, pin) → (humidity, temperature) + hum, temp = Adafruit_DHT.read_retry(self.sensor_type, self.bcm_pin) # type: ignore + if hum is not None and temp is not None: + humidity = float(hum) + temperature = float(temp) + break + + self.last_temperature = temperature + self.last_humidity = humidity + self.last_ok = (temperature is not None and humidity is not None) + return (temperature, humidity) + + # ------------------------------------------------------------------ + # Bilgiler + # ------------------------------------------------------------------ + def summary(self) -> str: + """ + Sensör hakkında kısa bir özet döndürür. + """ + mode = "MOCK" if self.mock_mode else "HW" + return f"DHT11Sensor(name={self.name}, pin=BCM{self.bcm_pin}, mode={mode})" + + +# ---------------------------------------------------------------------- +# Basit test +# ---------------------------------------------------------------------- +if __name__ == "__main__": + sensor = DHT11Sensor() + print(sensor.summary()) + t, h = sensor.read() + print("Okuma sonucu: T={0}°C, H={1}%".format(t, h)) + diff --git a/ebuild/io/z2legacy_syslog.py b/ebuild/io/z2legacy_syslog.py new file mode 100644 index 0000000..1b94ef6 --- /dev/null +++ b/ebuild/io/z2legacy_syslog.py @@ -0,0 +1,608 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "legacy_syslog" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Legacy tarzı syslog çıktısı üreten köprü" +__version__ = "0.2.1" +__date__ = "2025-11-22" + +""" +ebuild/io/legacy_syslog.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +Eski Rasp2 tabanlı sistemin syslog çıktısını, yeni ebuild mimarisi ile +uyumlu ve okunaklı şekilde üretir. Çıktı şu ana bloklardan oluşur: + + 1) Üst bilgi: + - Versiyon ve zaman satırı + - Güneş bilgisi (sunrise / sunset, sistem On/Off, lisans id) + - Mevsim bilgisi (season, bahar dönemi bilgisi) + - Tatil bilgisi (varsa adıyla) + + 2) Bina ısı bilgisi + - Bina Isı : [ min - avg - max ] + + 3) Hat sensörleri (burner.py içinden doldurulan kısım): + - Dış Isı 1 + - Çıkış Isı 2 + - Dönüş hatları (isim map'inden) + + 4) Used dış ısı + 5) Brülör / devirdaim / özet satırı + +Not +--- +Bu modül sadece formatlama ve çıktı üretiminden sorumludur. Gerçek +ölçümler ve kontrol kararları üst katmanlardan (HeatEngine, Burner, +Building, Environment, SeasonController vb.) alınır. +""" +# Bu modül gerçekten hangi path'ten import ediliyor, görmek için: +# --------------------------------------------------------- +def _safe_import(desc, import_func): + """ + desc: ekranda görünecek ad (örn: 'Building', 'legacy_syslog') + import_func: gerçek import'u yapan lambda + """ + try: + obj = import_func() + #print(f"legacy_syslog.py [IMPORT OK] {desc} ->", obj) + return obj + except Exception as e: + print(f"legacy_syslog.py [IMPORT FAIL] {desc}: {e}") + traceback.print_exc() + return None + +from datetime import datetime, time +from typing import Optional + +import logging +import logging.handlers + +try: + # SeasonController ve konfig + from ..core.season import SeasonController + cfg = _safe_import( "config_statics", lambda: __import__("ebuild.config_statics", fromlist=["*"]),) + cfv = _safe_import( "config_runtime", lambda: __import__("ebuild.config_runtime", fromlist=["*"]),) + #from .. import config_statics as cfg +except ImportError: # test / standalone + SeasonController = None # type: ignore + cfg = None # type: ignore + cfv = None + print("SeasonController, config_statics import ERROR") + +# ---------------------------------------------------------------------- +# Logger kurulumu (Syslog + stdout) +# ---------------------------------------------------------------------- +_LOGGER: Optional[logging.Logger] = None + + +def _get_logger() -> logging.Logger: + global _LOGGER + if _LOGGER is not None: + return _LOGGER + #print("logger..1:", stream_fmt) + logger = logging.getLogger("BRULOR") + logger.setLevel(logging.INFO) + + # Aynı handler'ları ikinci kez eklemeyelim + if not logger.handlers: + # Syslog handler (Linux: /dev/log) + try: + syslog_handler = logging.handlers.SysLogHandler(address="/dev/log") + # Syslog mesaj formatı: "BRULOR: [ 1 ... ]" + fmt = logging.Formatter("%(name)s: %(message)s") + syslog_handler.setFormatter(fmt) + logger.addHandler(syslog_handler) + except Exception: + # /dev/log yoksa sessizce geç; sadece stdout'a yazacağız + pass + + # Konsol çıktısı (debug için) + stream_handler = logging.StreamHandler() + stream_fmt = logging.Formatter("INFO:BRULOR:%(message)s") + stream_handler.setFormatter(stream_fmt) + logger.addHandler(stream_handler) + print("logger..2:", stream_fmt) + _LOGGER = logger + return logger + + +# ---------------------------------------------------------------------- +# Temel çıktı fonksiyonları +# ---------------------------------------------------------------------- + +def send_legacy_syslog(message: str) -> None: + """ + Verilen mesajı legacy syslog formatına uygun şekilde ilgili hedefe gönderir. + - Syslog (/dev/log) → program adı: BRULOR + - Aynı zamanda stdout'a da yazar (DEBUG amaçlı) + """ + #print("send_legacy_syslog BRULOR:", message) + try: + logger = _get_logger() + logger.info(message) + except Exception as e: + # Logger bir sebeple çökerse bile BRULOR satırını kaybetmeyelim + print("BRULOR:", message, f"(logger error: {e})") + + +def format_line(line_no: int, body: str) -> str: + """ + BRULOR satırını klasik formata göre hazırlar. + + Örnek: + line_no = 2, body = "Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094" + + "[ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094]" + + Not: + Burada "BRULOR" yazmıyoruz; syslog program adı zaten BRULOR olacak. + """ + return f"[{line_no:3d} {body}]" + + +def _format_version_3part(ver: str) -> str: + """ + __version__ string'ini "00.02.01" formatına çevirir. + Örnek: + "0.2.1" → "00.02.01" + """ + parts = (ver or "").split(".") + nums = [] + for p in parts: + try: + nums.append(int(p)) + except ValueError: + nums.append(0) + while len(nums) < 3: + nums.append(0) + return f"{nums[0]:02d}.{nums[1]:02d}.{nums[2]:02d}" + + +# ---------------------------------------------------------------------- +# Üst blok (header) üreticiler +# ---------------------------------------------------------------------- +def emit_header_version(line_no: int, now: datetime) -> int: + """ + 1. satır: versiyon + zaman bilgisi. + Örnek: + ************** 00.02.01 2025-11-22 18:15:00 ************* + """ + v_str = _format_version_3part(__version__) + body = f"************** {v_str} {now.strftime('%Y-%m-%d %H:%M:%S')} *************" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def emit_header_sun_and_system( + line_no: int, + sunrise: Optional[time], + sunset: Optional[time], + system_on: bool, + licence_id: int, +) -> int: + """ + 2. satır: Güneş bilgisi + Sistem On/Off + Lisans id. + + Örnek: + [ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094] + """ + sun_str = "" + if sunrise is not None: + sun_str += f"Sunrise:{sunrise.strftime('%H:%M')} " + if sunset is not None: + sun_str += f"Sunset:{sunset.strftime('%H:%M')} " + + sys_str = "On" if system_on else "Off" + body = f"{sun_str}Sistem: {sys_str} Lic:{licence_id}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def _only_date(s: str) -> str: + """ + ISO tarih-zaman stringinden sadece YYYY-MM-DD kısmını alır. + Örn: '2025-09-23T16:33:10.687982+03:00' → '2025-09-23' + """ + if not s: + return "--" + s = s.strip() + if "T" in s: + return s.split("T", 1)[0] + return s + +def emit_header_season( + line_no: int, + season_ctrl: SeasonController, +) -> int: + """ + Sunrise satırının altına mevsim + (varsa) bahar tasarruf dönemi satırını basar. + + Beklenen format: + + BRULOR [ 3 season : Sonbahar 2025-09-23 - 2025-12-20 [89 pass:60 kalan:28] ] + BRULOR [ 4 bahar : 2025-09-23 - 2025-10-13 ] + + Notlar: + - Bilgiler SeasonController.info içinden okunur (dict veya obje olabilir). + - bahar_tasarruf True DEĞİLSE bahar satırı hiç basılmaz. + """ + + # SeasonController.info hem dict hem obje olabilir, ikisini de destekle + info = getattr(season_ctrl, "info", season_ctrl) + + def _get(field: str, default=None): + if isinstance(info, dict): + return info.get(field, default) + return getattr(info, field, default) + + # ---- 3. satır: season ---- + season_name = _get("season", "Unknown") + season_start = _only_date(_get("season_start", "")) + season_end = _only_date(_get("season_end", "")) + season_day = _get("season_day", "") + season_passed = _get("season_passed", "") + season_remain = _get("season_remaining", "") + + body = ( + f"season : {season_name} {season_start} - {season_end} " + f"[{season_day} pass:{season_passed} kalan:{season_remain}]" + ) + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # ---- 4. satır: bahar dönemi (SADECE aktifse) ---- + bahar_tasarruf = bool(_get("bahar_tasarruf", False)) + if bahar_tasarruf: + bahar_basx = _only_date(_get("bahar_basx", "")) + bahar_bitx = _only_date(_get("bahar_bitx", "")) + body = f"bahar : {bahar_basx} - {bahar_bitx}" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + return line_no + + +def emit_header_holiday( + line_no: int, + is_holiday: bool, + holiday_label: str, +) -> int: + """ + Tatil satırı (sunrise + season altına). + + Kurallar: + - Tatil yoksa (False) HİÇ satır basma. + - Tatil varsa: + [ 5 Tatil: True Adı: Cumhuriyet Bayramı] + """ + if not is_holiday: + return line_no + + label = holiday_label or "" + body = f"Tatil: True Adı: {label}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +# ---------------------------------------------------------------------- +# Dışarıdan çağrılacak üst-blok helper +# ---------------------------------------------------------------------- +def emit_top_block( + now: datetime, + season_ctrl: SeasonController, +) -> int: + """ + F veya B modundan bağımsız olarak, her tick başında üst bilgiyi üretir. + + Sıra: + 1) Versiyon + zaman + 2) Sunrise / Sunset / Sistem: On/Off / Lic + 3) Mevsim bilgisi (SeasonController.to_syslog_lines() → sadeleştirilmiş) + 4) Tatil bilgisi (sadece tatil varsa) + 5) Bir sonraki satır numarasını döndürür (bina ısı satırları için). + """ + line_no = 1 + + # 1) Versiyon + line_no = emit_header_version(line_no, now) + + # Konfigten sistem ve lisans bilgileri + if cfg is not None: + licence_id = int(getattr(cfg, "BUILDING_LICENCEID", 0)) + system_onoff = int(getattr(cfg, "BUILDING_SYSTEMONOFF", 1)) + else: + licence_id = 0 + system_onoff = 1 + + system_on = (system_onoff == 1) + + # 2) Güneş + Sistem / Lisans + sunrise = season_ctrl.info.sunrise + sunset = season_ctrl.info.sunset + + line_no = emit_header_sun_and_system( + line_no=line_no, + sunrise=sunrise, + sunset=sunset, + system_on=system_on, + licence_id=licence_id, + ) + + # 3) Mevsim bilgisi (sunrise ALTINA) + line_no = emit_header_season(line_no, season_ctrl) + + # 4) Tatil bilgisi (sadece True ise) + line_no = emit_header_holiday( + line_no=line_no, + is_holiday=season_ctrl.info.is_holiday, + holiday_label=season_ctrl.info.holiday_label, + ) + + # Sonraki satır: bina ısı / dış ısı / F-B detayları için kullanılacak + return line_no + +def _fmt_temp(val: Optional[float]) -> str: + return "None" if val is None else f"{val:.2f}" + PUMP_SHORT_MAP = { + "circulation_a": "A", + "circulation_b": "B", + "circ_1": "A", + "circ_2": "B", + } + +def _short_pump_name(ch: str) -> str: + if ch in PUMP_SHORT_MAP: + return PUMP_SHORT_MAP[ch] + # sonu _a/_b ise yine yakala + if ch.endswith("_a"): + return "A" + if ch.endswith("_b"): + return "B" + return ch # tanımıyorsak orijinal ismi yaz + +def log_burner_header( + now: datetime, + mode: str, + season, + building_avg: Optional[float], + outside_c: Optional[float], + used_out_c: Optional[float], + fire_sp: float, + burner_on: bool, + pumps_on, + line_temps: Optional[Dict[str, Optional[float]]] = None, + ign_stats=None, + circ_stats=None, +) -> None: + """ + BurnerController'dan tek çağrıyla BRULOR bloğunu basar. + + - Önce üst blok (versiyon + güneş + mevsim + tatil) + - Sonra bina ısı satırı + - Dış ısı / used dış ısı + - Son satırda brülör ve pompaların durumu + """ + #print("log_burner_header CALLED", season) + # 1) Üst header blok + if season is None: + # SeasonController yoksa, sadece versiyon ve zaman bas + line_no = 1 + v_str = _format_version_3part(__version__) + body = f"************** {v_str} {now.strftime('%Y-%m-%d %H:%M:%S')} *************" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + else: + line_no = emit_top_block(now, season) + + # 2) Bina ısı satırı + if building_avg is None: + min_s = "None" + avg_s = "None" + max_s = "None" + else: + # Şimdilik min=avg=max gibi davranalım; ileride gerçek min/max eklenebilir + min_s = f"{building_min:5.2f}" + avg_s = f"{building_avg:5.2f}" + max_s = f"{building_max:5.2f}" + + # config’teki mod + cfg_mode = getattr(cfg, "BUILD_BURNER", "?") if cfg is not None else "?" + body = f"Build [{mode}-{cfg_mode}] Heats[Min:{min_s}°C Avg:{avg_s}°C Max:{max_s}°C]" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # line_temps yoksa, burayı pas geç + if line_temps is not None: + # CONFIG'TEN ID'LERİ AL + outside_id = getattr(cfg, "OUTSIDE_SENSOR_ID", None) if cfg is not None else None + out_id = getattr(cfg, "BURNER_OUT_SENSOR_ID", None) if cfg is not None else None + ret_ids = getattr(cfg, "RETURN_LINE_SENSOR_IDS", []) if cfg is not None else [] + ret_map = getattr(cfg, "RETURN_LINE_SENSOR_NAME_MAP", {}) if cfg is not None else {} + line_no = 4 # dış ısı satırı numarası + + # 4: Dis isi + if outside_id and outside_id in line_temps: + t = line_temps.get(outside_id) + namex = getattr(cfg, "OUTSIDE_SENSOR_NAME", "Dis isi") if cfg is not None else "Dis isi" + msg = f"{namex:<15.15}: {_fmt_temp(t)}°C - {outside_id} " + send_legacy_syslog(format_line(line_no, msg)) + line_no += 1 + + # 5: Cikis isi + if out_id and out_id in line_temps: + t = line_temps.get(out_id) + namex = getattr(cfg, "BURNER_OUT_SENSOR_NAME", "Cikis isi") if cfg is not None else "Cıkıs isi" + msg = f"{namex:<15.15}: {_fmt_temp(t)}°C - {out_id} " + send_legacy_syslog(format_line(line_no, msg)) + line_no += 1 + + # 6..N: Donus isi X + namex = getattr(cfg, "RETURN_LINE_SENSOR_NAME_MAP",[]) + for sid in ret_ids: + if sid not in line_temps: + continue + t = line_temps.get(sid) + try: + namexx = ret_map.get(sid) + except: + namex = '???' + msg = f"{namexx:<15.15}: {_fmt_temp(t)}°C - {sid} " + send_legacy_syslog(format_line(line_no, msg)) + line_no += 1 + + # 3) Dış ısı / used dış ısı + out_str = "--" + used_str = "--" + if outside_c is not None: + out_str = f"{outside_c:5.2f}" + if used_out_c is not None: + used_str = f"{used_out_c:5.2f}" + usedxx = "Sistem Isı" + + #------------------------------------------------------------------ + # 9: Sistem Isı - Used + [WEEKEND_HEAT_BOOST_C, BURNER_COMFORT_OFFSET_C] + # ------------------------------------------------------------------ + used_val = used_out_c if used_out_c is not None else None + used_str = "None" if used_val is None else f"{used_val:.2f}" + + if cfv is not None: + w_val = float(getattr(cfv, "WEEKEND_HEAT_BOOST_C", 0.0) or 0.0) + c_val = float(getattr(cfv, "BURNER_COMFORT_OFFSET_C", 0.0) or 0.0) + else: + w_val = 0.0 + c_val = 0.0 + + # Sayıları [2, 1] gibi, gereksiz .0’sız yazalım + def _fmt_num(x: float) -> str: + if x == int(x): + return str(int(x)) + return f"{x:g}" + + sabitler_str = f"[w:{_fmt_num(w_val)} c:{_fmt_num(c_val)}]" + + body = f"{usedxx:<15.15}: {used_str}°C {sabitler_str} " + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # ------------------------------------------------------------------ + # 11: Brülör Motor satırı (MAX_OUTLET_C ile) + # ------------------------------------------------------------------ + if cfv is not None: + max_out = float(getattr(cfv, "MAX_OUTLET_C", 45.0) or 45.0) + else: + max_out = 45.0 + + if cfv is not None: + min_ret = float(getattr(cfv, "CIRCULATION_MIN_RETURN_C", 25.0) or 25.0) + else: + min_ret = 25.0 + + br_status = "" if burner_on else "" + br_flag = 1 if burner_on else 0 + ign_sw = 0 + ign_total = "00:00:00" + ign_today = "00:00:00" + if ign_stats: + ign_sw = ign_stats.get("switch_count", 0) + ign_total = ign_stats.get("total_on_str", "00:00:00") + ign_today = ign_stats.get("today_on_str", "00:00:00") + # Eski stile benzeteceğiz: + # [ 11 Brulor Motor : [0] 0 00:00:00 00:00:00 L:45.0 ] + body11 = ( + f"Brulor Motor : {br_status} " + f"[{br_flag}] {ign_sw} {ign_total} {ign_today} L:{max_out:.1f}" + ) + send_legacy_syslog(format_line(line_no, body11)) + line_no += 1 + # ------------------------------------------------------------------ + # 12: Devirdaim Motor satırı (CIRCULATION_MIN_RETURN_C ile) + # ------------------------------------------------------------------ + ch_to_logical = {} + pumps_on_list = list(pumps_on) if pumps_on else [] + + # --- circulation mapping: channel -> logical ('circ_1', 'circ_2') --- + ch_to_logical = {} + cfg_groups = getattr(cfg, "BURNER_GROUPS", {}) + # ileride çoklu brülör olursa buraya burner_id parametresi de geçirsin istersen + grp = cfg_groups.get(0, {}) + circ_cfg = grp.get("circulation", {}) or {} + + for logical_name, info in circ_cfg.items(): + ch = info.get("channel") + if ch: + ch_to_logical[ch] = logical_name + + # Config’te default=1 olan pompaları da topla (cfg_default_pumps) + cfg_default_pumps = [] + for logical_name, info in circ_cfg.items(): + ch = info.get("channel") + if ch and info.get("default", 0): + cfg_default_pumps.append(ch) + + # Kısa isim A/B istersek: + def _logical_to_short(name: str) -> str: + if name == "circ_1": + return "A" + if name == "circ_2": + return "B" + return name + + pump_count = len(cfg_default_pumps) + dev_status = "" if pump_count > 0 else "" + + pump_labels = [] + for ch in cfg_default_pumps: + logical = ch_to_logical.get(ch) + if logical is not None: + pump_labels.append(_logical_to_short(logical)) + else: + pump_labels.append(ch) + + pumps_str = ",".join(pump_labels) if pump_labels else "-" + cir_sw = 0 + cir_total = "00:00:00" + cir_today = "00:00:00" + if circ_stats: + cir_sw = circ_stats.get("switch_count", 0) + cir_total = circ_stats.get("total_on_str", "00:00:00") + cir_today = circ_stats.get("today_on_str", "00:00:00") + # [ 12 Devirdaim Mot: [0] 0 00:00:00 00:00:00 L:25.0] + body12 = ( + f"Devirdaim Mot: {dev_status} " + f"[{pump_count}] {br_flag}] {cir_sw} {cir_total} {cir_today} L:{pumps_str} {min_ret:.1f}" + ) + send_legacy_syslog(format_line(line_no, body12)) + line_no += 1 + + + return line_no + + + +# ---------------------------------------------------------------------- +# Örnek kullanım (standalone test) +# ---------------------------------------------------------------------- +if __name__ == "__main__": + # Bu blok sadece modülü tek başına test etmek için: + # python3 -m ebuild.io.legacy_syslog + if SeasonController is None: + raise SystemExit("SeasonController import edilemedi (test ortamı).") + + now = datetime.now() + # SeasonController.from_now() kullanıyorsan: + try: + season = SeasonController.from_now() + except Exception as e: + raise SystemExit(f"SeasonController.from_now() hata: {e}") + + next_line = emit_top_block(now, season) + + # Test için bina ısısını dummy bas: + body = "Bina Isı : [ 20.10 - 22.30 - 24.50 ]" + send_legacy_syslog(format_line(next_line, body)) diff --git a/ebuild/io/z2relay_driver.py b/ebuild/io/z2relay_driver.py new file mode 100644 index 0000000..c32bb59 --- /dev/null +++ b/ebuild/io/z2relay_driver.py @@ -0,0 +1,388 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "relay_driver" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "GPIO röle sürücüsü + brülör grup soyutlaması" +__version__ = "0.4.0" +__date__ = "2025-11-22" + +""" +ebuild/io/relay_driver.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- Soyut kanal isimleri ile (igniter, circulation_a, ...) GPIO pin sürmek. +- config_statics.BURNER_GROUPS üzerinden brülör gruplarını yönetmek. +- Her kanal için: + * ON/OFF sayacı + * Son çalışma süresi + * Toplam çalışma süresi + * Şu anki çalışma süresi (eğer röle ON ise, anlık akan süre) + istatistiklerini tutmak. + +Kullanım +-------- +- Temel kanal API: + drv.channels() → ['igniter', 'circulation_a', ...] + drv.set_channel("igniter", True/False) + drv.get_stats("igniter") → RelayStats + drv.get_channel_state("igniter") → bool (şu an ON mu?) + +- Brülör grup API: + drv.burners() → [0, 1, ...] + drv.burner_info(0) → config_statics.BURNER_GROUPS[0] + drv.igniter_channel(0) → "igniter" + drv.all_pumps(0) → ['circulation_a', 'circulation_b', ...] + drv.enabled_pumps(0) → default=1 olan pompalar + drv.active_pumps(0) → şu anda gerçekten ON olan pompalar + +Bu API'ler burner.py ve legacy_syslog.py tarafından kullanılmak üzere tasarlanmıştır. +""" + +import time +from dataclasses import dataclass, field +from typing import Dict, Optional, Iterable, Tuple, List + +try: + import RPi.GPIO as GPIO + _HAS_GPIO = True +except ImportError: + _HAS_GPIO = False + +from .. import config_statics as cfg +# GPIO aktif seviyesini seç +# Birçok Çin röle kartı ACTIVE_LOW çalışır: +# - LOW → röle ÇEKER +# - HIGH → röle BIRAKIR +# Eğer kartın tam tersi ise bunu False yaparsın. +ACTIVE_LOW = True + + +# ------------------------------------------------------------------- +# İstatistik yapısı +# ------------------------------------------------------------------- +@dataclass +class RelayStats: + """ + Tek bir röle kanalı için istatistikler. + + - on_count : kaç defa ON'a çekildi + - last_on_ts : en son ON'a çekildiği zaman (epoch saniye) + - last_off_ts : en son OFF olduğu zaman (epoch saniye) + - last_duration_s : en son ON periyodunun süresi (saniye) + - total_on_s : bugüne kadar toplam ON kalma süresi (saniye) + """ + on_count: int = 0 + last_on_ts: Optional[float] = None + last_off_ts: Optional[float] = None + last_duration_s: float = 0.0 + total_on_s: float = 0.0 + + def on(self, now: float) -> None: + """ + Kanal ON'a çekildiğinde çağrılır. + Aynı ON periyodu içinde tekrar çağrılırsa sayaç artmaz. + """ + if self.last_on_ts is None: + self.last_on_ts = now + self.on_count += 1 + + def off(self, now: float) -> None: + """ + Kanal OFF'a çekildiğinde çağrılır. + Son ON zamanına göre süre hesaplanır, last_duration_s ve total_on_s güncellenir. + """ + if self.last_on_ts is not None: + dur = max(0.0, now - self.last_on_ts) + self.last_duration_s = dur + self.total_on_s += dur + self.last_on_ts = None + self.last_off_ts = now + + def current_duration(self, now: Optional[float] = None) -> float: + """ + Kanal şu anda ON ise, bu ON periyodunun şu ana kadarki süresini döndürür. + OFF ise 0.0 döner. + """ + if self.last_on_ts is None: + return 0.0 + if now is None: + now = time.time() + return max(0.0, now - self.last_on_ts) + + +# ------------------------------------------------------------------- +# Ana sürücü +# ------------------------------------------------------------------- +class RelayDriver: + """ + Basit bir röle sürücüsü. + + - Soyut kanal isimleri: RELAY_GPIO dict'indeki anahtarlar + - Brülör grup API'si: + * burners() → mevcut brülör id listesi + * burner_info(bid) → config_statics.BURNER_GROUPS[bid] + * igniter_channel(bid) → ateşleme kanal adı + * set_igniter(bid, state) + * set_pump(bid, pump_name, state) + * enabled_pumps(bid) → default=1 olan isimler (konfig default) + * all_pumps(bid) → tüm pompa isimleri + * active_pumps(bid) → şu anda ON olan pompa isimleri + """ + + def __init__(self, onoff=False) -> None: + print("RelayDriver yükleniyor…") + + # Konfigten kanal → GPIO pin map + self._pin_map: Dict[str, int] = dict(getattr(cfg, "RELAY_GPIO", {})) + + # Her kanal için istatistik objesi + self._stats: Dict[str, RelayStats] = { + ch: RelayStats() for ch in self._pin_map.keys() + } + + # Brülör grupları + self._burner_groups: Dict[int, dict] = dict(getattr(cfg, "BURNER_GROUPS", {})) + + if not self._pin_map: + raise RuntimeError("RelayDriver: RELAY_GPIO boş.") + + if _HAS_GPIO: + GPIO.setmode(GPIO.BCM) + GPIO.setwarnings(False) # aynı pini yeniden kullanırken uyarı verme + for ch, pin in self._pin_map.items(): + GPIO.setup(pin, GPIO.OUT) + GPIO.output(pin, GPIO.LOW) + else: + print("⚠️ GPIO bulunamadı, DRY-RUN modunda çalışıyorum.") + + # Başlangıçta HER ŞEYİ KAPALIYA ÇEK + try: + if onoff: + self.all_off() + except Exception: + # Çok dert etmeyelim, en kötü GPIO yoktur, vs. + pass + # ----------------------------------------------------- + # Temel kanal API + # ----------------------------------------------------- + def channels(self) -> Iterable[str]: + """ + Mevcut kanal isimlerini döndürür. + """ + return self._pin_map.keys() + + def channel_pin(self, channel: str) -> Optional[int]: + """ + Verilen kanalın GPIO pin numarasını döndürür. + """ + return self._pin_map.get(channel) + + def set_channel(self, channel: str, state: bool) -> None: + """ + Belirtilen kanalı ON/OFF yapar, GPIO'yu sürer ve istatistikleri günceller. + """ + if channel not in self._pin_map: + return + pin = self._pin_map[channel] + now = time.time() + + if _HAS_GPIO: + # Aktif-low kartlar için: + if ACTIVE_LOW: + gpio_state = GPIO.LOW if state else GPIO.HIGH + else: + gpio_state = GPIO.HIGH if state else GPIO.LOW + GPIO.output(pin, gpio_state) + + st = self._stats[channel] + if state: + st.on(now) + else: + st.off(now) + + def get_stats(self, channel: str) -> RelayStats: + """ + Kanalın istatistik objesini döndürür. + """ + return self._stats[channel] + + def get_channel_state(self, channel: str) -> bool: + """ + Kanal şu anda ON mu? (last_on_ts None değilse ON kabul edilir) + """ + st = self._stats.get(channel) + if st is None: + return False + return st.last_on_ts is not None + + # ----------------------------------------------------- + # Tüm kanalları güvenli moda çek + # ----------------------------------------------------- + def all_off(self) -> None: + """ + Tüm röle kanallarını KAPALI (LOW) yapar ve istatistikleri günceller. + Özellikle: + - Uygulama başlatıldığında "her şey kapalı" garantisi + - Çıkış/KeyboardInterrupt anında güvenli kapanış için kullanılır. + """ + now = time.time() + for ch, pin in self._pin_map.items(): + if _HAS_GPIO: + GPIO.output(pin, GPIO.LOW) + # stats güncelle + st = self._stats.get(ch) + if st is not None: + st.off(now) + + # ----------------------------------------------------- + # Brülör grup API + # ----------------------------------------------------- + def burners(self) -> Iterable[int]: + """ + Mevcut brülör id'lerini döndürür. + """ + return self._burner_groups.keys() + + def burner_info(self, burner_id: int) -> Optional[dict]: + """ + İlgili brülörün BURNER_GROUPS içindeki konfig dict'ini döndürür. + """ + return self._burner_groups.get(burner_id) + + def igniter_channel(self, burner_id: int) -> Optional[str]: + """ + Brülörün igniter kanal adını döndürür. + """ + info = self.burner_info(burner_id) + if not info: + return None + return info.get("igniter", None) + + def all_pumps(self, burner_id: int) -> Iterable[str]: + """ + Konfigte tanımlı tüm pompa kanal adlarını döndürür (circulation altı). + """ + info = self.burner_info(burner_id) + if not info: + return [] + circ = info.get("circulation", {}) + # Her pompa için { "channel": "circulation_a", "pin": 26, "default": 1 } beklenir. + return [data["channel"] for _, data in circ.items()] + + def enabled_pumps(self, burner_id: int) -> Iterable[str]: + """ + Konfigte default=1 işaretli pompa kanal adlarını döndürür. + Bu, sistem açıldığında / ısıtma başladığında devreye alınacak default pompaları temsil eder. + """ + info = self.burner_info(burner_id) + if not info: + return [] + circ = info.get("circulation", {}) + return [ + data["channel"] + for _, data in circ.items() + if int(data.get("default", 0)) == 1 + ] + + def active_pumps(self, burner_id: int) -> Tuple[str, ...]: + """ + Şu anda gerçekten ON olan pompa isimlerini döndürür. + (GPIO'da HIGH durumda olan kanallar; RelayStats.last_on_ts None değilse ON kabul edilir) + """ + info = self.burner_info(burner_id) + if not info: + return tuple() + circ = info.get("circulation", {}) + active: List[str] = [] + for pname, pdata in circ.items(): + ch = pdata.get("channel") + if ch in self._stats and self._stats[ch].last_on_ts is not None: + active.append(pname) + return tuple(active) + + def set_igniter(self, burner_id: int, state: bool) -> None: + """ + İlgili brülörün igniter kanalını ON/OFF yapar. + """ + ch = self.igniter_channel(burner_id) + if ch: + self.set_channel(ch, state) + + def set_pump(self, burner_id: int, pump_name: str, state: bool) -> None: + """ + Belirtilen brülörün belirtilen pompasını ON/OFF yapar. + + pump_name normalde BURNER_GROUPS[..]["circulation"].keys() + (örn: "circ_1", "circ_2") olmalıdır; ancak geriye dönük uyumluluk + için doğrudan kanal adı ("circulation_a" vb.) verilirse de kabul edilir. + """ + info = self.burner_info(burner_id) + if not info: + return + circ = info.get("circulation", {}) or {} + + # 1) pump_name bir logical ad ise ("circ_1" gibi) + if pump_name in circ: + ch = circ[pump_name].get("channel") + if ch: + self.set_channel(ch, state) + return + + # 2) Geriyedönük: pump_name doğrudan kanal adı ("circulation_a" gibi) + for logical_name, pdata in circ.items(): + ch = pdata.get("channel") + if ch == pump_name: + self.set_channel(ch, state) + return + + + # ----------------------------------------------------- + # Yardımcı: özet + # ----------------------------------------------------- + def summary(self) -> str: + """ + Kanallar ve brülör gruplarının kısa bir özetini döndürür (debug amaçlı). + """ + lines: List[str] = [] + chans = ", ".join(sorted(self._pin_map.keys())) + lines.append(f"Kanallar: {chans}") + + lines.append("Brülör grupları:") + for bid, info in self._burner_groups.items(): + name = info.get("name", f"Burner{bid}") + loc = info.get("location", "-") + ign = info.get("igniter", "igniter") + circ = info.get("circulation", {}) + pumps = [] + defaults = [] + for pname, pdata in circ.items(): + ch = pdata.get("channel", "?") + pumps.append(f"{pname}->{ch}") + if int(pdata.get("default", 0)) == 1: + defaults.append(pname) + lines.append( + f" #{bid}: {name} @ {loc} | igniter={ign} | " + f"pumps={pumps} | default_on={defaults}" + ) + return "\n".join(lines) + + # ----------------------------------------------------- + # Temizlik + # ----------------------------------------------------- + def cleanup(self) -> None: + """ + GPIO pinlerini serbest bırakır. + """ + if _HAS_GPIO: + GPIO.cleanup() + + +if __name__ == "__main__": + drv = RelayDriver() + print("\n🧰 RelayDriver Summary") + print(drv.summary()) diff --git a/ebuild/io/z3legacy_syslog.py b/ebuild/io/z3legacy_syslog.py new file mode 100644 index 0000000..e37f573 --- /dev/null +++ b/ebuild/io/z3legacy_syslog.py @@ -0,0 +1,463 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +""" +ebuild/io/legacy_syslog.py + +Legacy tarzı BRULOR syslog çıktısı üretmek için yardımcı fonksiyonlar. +- Syslog (/dev/log) + stdout'a aynı formatta basar. +- burner.BurnerController tarafından her tick'te çağrılan log_burner_header() + ile eski sistemdeki benzer satırları üretir. +""" + +__title__ = "legacy_syslog" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Legacy tarzı syslog çıktısı üreten köprü" +__version__ = "0.3.0" +__date__ = "2025-11-23" + +from datetime import datetime, time, timedelta +from typing import Optional, Iterable, Tuple, Dict + +import logging +import logging.handlers + +try: + # Mevsim + güneş bilgileri için + from ..core.season import SeasonController # type: ignore + from .. import config_statics as cfg # type: ignore +except ImportError: # test / standalone + SeasonController = None # type: ignore + cfg = None # type: ignore + +try: + # Çalışma parametreleri (konfor offset, max çıkış vb.) + from .. import config_runtime as cfg_v # type: ignore +except ImportError: + cfg_v = None # type: ignore + +try: + # Hat sensörlerinden doğrudan okuma için + from ..io.ds18b20 import DS18B20Sensor # type: ignore +except Exception: + DS18B20Sensor = None # type: ignore + +#print("legacy_syslog IMPORT EDİLDİ:", __file__) + +# ---------------------------------------------------------------------- +# Logger kurulumu (Syslog + stdout) +# ---------------------------------------------------------------------- +_LOGGER: Optional[logging.Logger] = None + + +def _get_logger() -> logging.Logger: + global _LOGGER + if _LOGGER is not None: + return _LOGGER + + logger = logging.getLogger("BRULOR") + logger.setLevel(logging.INFO) + + if not logger.handlers: + # Syslog handler (Linux: /dev/log) + try: + syslog_handler = logging.handlers.SysLogHandler(address="/dev/log") + # Syslog mesaj formatı: "BRULOR: [ 1 ... ]" + fmt = logging.Formatter("%(name)s: %(message)s") + syslog_handler.setFormatter(fmt) + logger.addHandler(syslog_handler) + except Exception as e: + print("legacy_syslog: SysLogHandler eklenemedi:", e) + + # Ayrıca stdout'a da yaz (debug için) + stream_handler = logging.StreamHandler() + stream_fmt = logging.Formatter("BRULOR: %(message)s") + stream_handler.setFormatter(stream_fmt) + logger.addHandler(stream_handler) + + _LOGGER = logger + return logger + + +def send_legacy_syslog(message: str) -> None: + """ + Verilen mesajı legacy syslog formatına uygun şekilde ilgili hedefe gönderir. + - Syslog (/dev/log) → program adı: BRULOR + - Aynı zamanda stdout'a da yazar (DEBUG amaçlı) + """ + try: + logger = _get_logger() + logger.info(message) + except Exception as e: + # Logger bir sebeple çökerse bile BRULOR satırını kaybetmeyelim + print("BRULOR:", message, f"(logger error: {e})") + + +def format_line(line_no: int, body: str) -> str: + """ + BRULOR satırını klasik formata göre hazırlar. + + line_no = 2, body = "Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094" + → "[ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094]" + """ + return f"[{line_no:3d} {body}]" + + +# ---------------------------------------------------------------------- +# Header yardımcıları +# ---------------------------------------------------------------------- +def _format_version_3part(ver: str) -> str: + """ + "0.2.1" → "00.02.01" formatı. + """ + parts = (ver or "").split(".") + nums = [] + for p in parts: + try: + nums.append(int(p)) + except ValueError: + nums.append(0) + while len(nums) < 3: + nums.append(0) + return f"{nums[0]:02d}.{nums[1]:02d}.{nums[2]:02d}" + + +def emit_header_version(line_no: int, now: datetime) -> int: + """ + 1. satır: versiyon + zaman bilgisi. + + ************** 00.02.01 2025-11-22 18:15:00 ************* + """ + v_str = _format_version_3part(__version__) + body = f"************** {v_str} {now.strftime('%Y-%m-%d %H:%M:%S')} *************" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def emit_header_sunrise( + line_no: int, + sunrise: time, + sunset: time, + system_on: bool, + licence_id: int, +) -> int: + """ + 2. satır: Sunrise/Sunset + sistem On/Off + Lisans id satırı. + + Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094 + """ + def _fmt_t(t: time) -> str: + if not t: + return "--:--" + return t.strftime("%H:%M") + + sun_str = f"Sunrise:{_fmt_t(sunrise)} Sunset:{_fmt_t(sunset)} " + sys_str = "On" if system_on else "Off" + body = f"{sun_str}Sistem: {sys_str} Lic:{licence_id}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def _only_date(s: str) -> str: + """ + ISO tarih-zaman stringinden sadece YYYY-MM-DD kısmını alır. + """ + if not s: + return "--" + s = s.strip() + if "T" in s: + s = s.split("T", 1)[0] + return s + +def emit_header_season(line_no: int, season_ctrl) -> int: + info = getattr(season_ctrl, "info", season_ctrl) + + # 1) SEASON satırı (bunu zaten yazıyorsun) + season_name = getattr(info, "season", "Unknown") + s_start = getattr(info, "season_start", "") + s_end = getattr(info, "season_end", "") + day_total = getattr(info, "season_day", 0) or 0 + day_passed = getattr(info, "season_passed", 0) or 0 + day_left = getattr(info, "season_remaining", 0) or 0 + + body = ( + f"season : {season_name} {s_start} - {s_end} " + f"[{day_total} pass:{day_passed} kalan:{day_left}]" + ) + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # 2) BAHAR / TASARRUF SATIRI + # SeasonInfo'dan tasarruf penceresini alıyoruz + saving_start = getattr(info, "saving_start", None) + saving_stop = getattr(info, "saving_stop", None) + today = getattr(info, "date", None) + + # saving_start/stop yoksa bahar satırı YOK + if saving_start is None or saving_stop is None or today is None: + return line_no + + # Gösterim penceresi: saving_start - 3 gün .. saving_stop + 3 gün + window_start = saving_start - timedelta(days=3) + window_stop = saving_stop + timedelta(days=3) + + if window_start <= today <= window_stop: + # Syslog'ta görünen tarih aralığı GERÇEK tasarruf aralığı olsun: + # saving_start / saving_stop + bahar_bas = saving_start.isoformat() + bahar_bit = saving_stop.isoformat() + body2 = f"bahar : {bahar_bas} - {bahar_bit}" + send_legacy_syslog(format_line(line_no, body2)) + line_no += 1 + + return line_no + +def emit_header_holiday( + line_no: int, + is_holiday: bool, + holiday_label: str, +) -> int: + """ + Tatil satırı (sunrise + season altına). + """ + if not is_holiday: + return line_no + label = holiday_label or "" + body = f"Tatil: True Adı: {label}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def emit_top_block( + now: datetime, + season_ctrl: "SeasonController", +) -> int: + """ + F veya B modundan bağımsız olarak, her tick başında üst bilgiyi üretir. + Dönüş: bir sonraki satır numarası. + """ + line_no = 1 + # 1: versiyon + zaman + line_no = emit_header_version(line_no, now) + + # 2: güneş bilgisi + info = getattr(season_ctrl, "info", season_ctrl) + sunrise = getattr(info, "sunrise", None) + sunset = getattr(info, "sunset", None) + system_on = bool(getattr(info, "system_on", True)) + licence_id = int( + getattr(info, "licence_id", getattr(cfg, "BUILDING_LICENCEID", 0)) + if cfg is not None + else 0 + ) + + line_no = emit_header_sunrise( + line_no=line_no, + sunrise=sunrise, + sunset=sunset, + system_on=system_on, + licence_id=licence_id, + ) + + # 3: mevsim + line_no = emit_header_season(line_no, season_ctrl) + + # 4: tatil (varsa) + is_hol = bool(getattr(info, "is_holiday", False)) + hol_label = getattr(info, "holiday_label", "") + line_no = emit_header_holiday(line_no, is_hol, hol_label) + + return line_no + + +# ---------------------------------------------------------------------- +# Hat sensörleri + brülör header +# ---------------------------------------------------------------------- +def _fmt_temp(t: Optional[float]) -> str: + if t is None: + return "None°C" + return f"{t:5.2f}°C" + + +def _read_line_temps_from_config() -> Dict[str, Optional[float]]: + """ + OUTSIDE_SENSOR_ID, BURNER_OUT_SENSOR_ID ve RETURN_LINE_SENSOR_IDS + için DS18B20 üzerinden anlık sıcaklıkları okur. + """ + temps: Dict[str, Optional[float]] = {} + if DS18B20Sensor is None or cfg is None: + return temps + + outside_id = getattr(cfg, "OUTSIDE_SENSOR_ID", "") or "" + out_id = getattr(cfg, "BURNER_OUT_SENSOR_ID", "") or "" + ret_ids = list(getattr(cfg, "RETURN_LINE_SENSOR_IDS", []) or []) + + all_ids = [] + if outside_id: + all_ids.append(outside_id) + if out_id: + all_ids.append(out_id) + all_ids.extend([sid for sid in ret_ids if sid]) + + for sid in all_ids: + try: + sensor = DS18B20Sensor(serial=sid) + temps[sid] = sensor.read_temperature() + except Exception: + temps[sid] = None + + return temps + + +def log_burner_header( + now: datetime, + mode: str, + season: "SeasonController", + building_avg: Optional[float], + outside_c: Optional[float], + used_out_c: Optional[float], + fire_sp: float, + burner_on: bool, + pumps_on: Iterable[str], +) -> None: + """ + burner.BurnerController.tick() her çağrıldığında; header + bina özet + + hat sensörleri + sistem ısı + brülör/devirdaim satırlarını üretir. + """ + try: + # 1) Üst blok + if season is not None and SeasonController is not None: + line_no = emit_top_block(now, season) + else: + line_no = emit_header_version(1, now) + + # 2) Bina ısı satırı + mode = (mode or "?").upper() + cfg_mode = ( str(getattr(cfg, "BUILD_BURNER", mode)).upper() if cfg is not None else mode ) + outside_limit = float(getattr(cfg_v, "OUTSIDE_LIMIT_HEAT_C", 0.0)) + min_c = None + max_c = None + avg_c = building_avg + + body_build = ( + f"Build [{mode}-{cfg_mode}] " + f"Heats[Min:{_fmt_temp(min_c)} Avg:{_fmt_temp(avg_c)} Max:{_fmt_temp(max_c)}] L:{outside_limit}" + ) + send_legacy_syslog(format_line(line_no, body_build)) + line_no += 1 + + # 3) Hat sensörleri + line_temps = _read_line_temps_from_config() + outside_id = getattr(cfg, "OUTSIDE_SENSOR_ID", "") if cfg is not None else "" + outside_name = ( + getattr(cfg, "OUTSIDE_SENSOR_NAME", "Dış Isı 1") + if cfg is not None + else "Dış Isı 1" + ) + out_id = getattr(cfg, "BURNER_OUT_SENSOR_ID", "") if cfg is not None else "" + out_name = ( + getattr(cfg, "BURNER_OUT_SENSOR_NAME", "Çıkış Isı 2") + if cfg is not None + else "Çıkış Isı 2" + ) + ret_ids = ( + list(getattr(cfg, "RETURN_LINE_SENSOR_IDS", []) or []) + if cfg is not None + else [] + ) + name_map = getattr(cfg, "RETURN_LINE_SENSOR_NAME_MAP", {}) if cfg is not None else {} + + if outside_id: + t = line_temps.get(outside_id, outside_c) + body = f"{outside_name:<15}: {_fmt_temp(t)} - {outside_id} " + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + if out_id: + t = line_temps.get(out_id) + body = f"{out_name:<15}: {_fmt_temp(t)} - {out_id} " + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + for sid in ret_ids: + if not sid: + continue + t = line_temps.get(sid) + nm = name_map.get(sid, sid) + body = f"{nm:<15}: {_fmt_temp(t)} - {sid} " + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # 4) Sistem ısı satırı (used_out + weekend/comfort offset) + weekend_boost = ( + float(getattr(cfg_v, "WEEKEND_HEAT_BOOST_C", 0.0)) + if cfg_v is not None + else 0.0 + ) + comfort_off = ( + float(getattr(cfg_v, "BURNER_COMFORT_OFFSET_C", 0.0)) + if cfg_v is not None + else 0.0 + ) + body_sys = ( + f"Sistem Isı : {_fmt_temp(used_out_c)} " + f"[w:{weekend_boost:g} c:{comfort_off:g}]" + ) + send_legacy_syslog(format_line(line_no, body_sys)) + line_no += 1 + + # 5) Brülör / devirdaim satırları (istatistikler şimdilik 0) + max_out = ( + float(getattr(cfg_v, "MAX_OUTLET_C", fire_sp)) + if cfg_v is not None + else fire_sp + ) + br_status = "" if burner_on else "" + br_flag = 1 if burner_on else 0 + + body_br = ( + f"Brulor Motor : {br_status} [{br_flag}] " + f"0 00:00:00 00:00:00 L:{max_out:.1f}" + ) + send_legacy_syslog(format_line(line_no, body_br)) + line_no += 1 + + pumps_on_list = list(pumps_on or []) + pump_count = len(pumps_on_list) + dev_status = "" if pump_count > 0 else "" + min_ret = ( + float(getattr(cfg_v, "CIRCULATION_MIN_RETURN_C", 25.0)) + if cfg_v is not None + else 25.0 + ) + pumps_str = ",".join(pumps_on_list) if pumps_on_list else "-" + + body_dev = ( + f"Devirdaim Mot: {dev_status} " + f"[{pump_count}] 0 00:00:00 00:00:00 " + f"L:{pumps_str} {min_ret:.1f}" + ) + send_legacy_syslog(format_line(line_no, body_dev)) + + except Exception as exc: + print("BRULOR log_burner_header ERROR:", exc) + + +if __name__ == "__main__": + # Basit standalone test + now = datetime.now() + if SeasonController is None: + emit_header_version(1, now) + else: + sc = SeasonController() + log_burner_header( + now=now, + mode="F", + season=sc, + building_avg=None, + outside_c=None, + used_out_c=None, + fire_sp=45.0, + burner_on=False, + pumps_on=(), + ) diff --git a/ebuild/io/zlegacy_syslog.py b/ebuild/io/zlegacy_syslog.py new file mode 100644 index 0000000..1b94ef6 --- /dev/null +++ b/ebuild/io/zlegacy_syslog.py @@ -0,0 +1,608 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "legacy_syslog" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "Legacy tarzı syslog çıktısı üreten köprü" +__version__ = "0.2.1" +__date__ = "2025-11-22" + +""" +ebuild/io/legacy_syslog.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +Eski Rasp2 tabanlı sistemin syslog çıktısını, yeni ebuild mimarisi ile +uyumlu ve okunaklı şekilde üretir. Çıktı şu ana bloklardan oluşur: + + 1) Üst bilgi: + - Versiyon ve zaman satırı + - Güneş bilgisi (sunrise / sunset, sistem On/Off, lisans id) + - Mevsim bilgisi (season, bahar dönemi bilgisi) + - Tatil bilgisi (varsa adıyla) + + 2) Bina ısı bilgisi + - Bina Isı : [ min - avg - max ] + + 3) Hat sensörleri (burner.py içinden doldurulan kısım): + - Dış Isı 1 + - Çıkış Isı 2 + - Dönüş hatları (isim map'inden) + + 4) Used dış ısı + 5) Brülör / devirdaim / özet satırı + +Not +--- +Bu modül sadece formatlama ve çıktı üretiminden sorumludur. Gerçek +ölçümler ve kontrol kararları üst katmanlardan (HeatEngine, Burner, +Building, Environment, SeasonController vb.) alınır. +""" +# Bu modül gerçekten hangi path'ten import ediliyor, görmek için: +# --------------------------------------------------------- +def _safe_import(desc, import_func): + """ + desc: ekranda görünecek ad (örn: 'Building', 'legacy_syslog') + import_func: gerçek import'u yapan lambda + """ + try: + obj = import_func() + #print(f"legacy_syslog.py [IMPORT OK] {desc} ->", obj) + return obj + except Exception as e: + print(f"legacy_syslog.py [IMPORT FAIL] {desc}: {e}") + traceback.print_exc() + return None + +from datetime import datetime, time +from typing import Optional + +import logging +import logging.handlers + +try: + # SeasonController ve konfig + from ..core.season import SeasonController + cfg = _safe_import( "config_statics", lambda: __import__("ebuild.config_statics", fromlist=["*"]),) + cfv = _safe_import( "config_runtime", lambda: __import__("ebuild.config_runtime", fromlist=["*"]),) + #from .. import config_statics as cfg +except ImportError: # test / standalone + SeasonController = None # type: ignore + cfg = None # type: ignore + cfv = None + print("SeasonController, config_statics import ERROR") + +# ---------------------------------------------------------------------- +# Logger kurulumu (Syslog + stdout) +# ---------------------------------------------------------------------- +_LOGGER: Optional[logging.Logger] = None + + +def _get_logger() -> logging.Logger: + global _LOGGER + if _LOGGER is not None: + return _LOGGER + #print("logger..1:", stream_fmt) + logger = logging.getLogger("BRULOR") + logger.setLevel(logging.INFO) + + # Aynı handler'ları ikinci kez eklemeyelim + if not logger.handlers: + # Syslog handler (Linux: /dev/log) + try: + syslog_handler = logging.handlers.SysLogHandler(address="/dev/log") + # Syslog mesaj formatı: "BRULOR: [ 1 ... ]" + fmt = logging.Formatter("%(name)s: %(message)s") + syslog_handler.setFormatter(fmt) + logger.addHandler(syslog_handler) + except Exception: + # /dev/log yoksa sessizce geç; sadece stdout'a yazacağız + pass + + # Konsol çıktısı (debug için) + stream_handler = logging.StreamHandler() + stream_fmt = logging.Formatter("INFO:BRULOR:%(message)s") + stream_handler.setFormatter(stream_fmt) + logger.addHandler(stream_handler) + print("logger..2:", stream_fmt) + _LOGGER = logger + return logger + + +# ---------------------------------------------------------------------- +# Temel çıktı fonksiyonları +# ---------------------------------------------------------------------- + +def send_legacy_syslog(message: str) -> None: + """ + Verilen mesajı legacy syslog formatına uygun şekilde ilgili hedefe gönderir. + - Syslog (/dev/log) → program adı: BRULOR + - Aynı zamanda stdout'a da yazar (DEBUG amaçlı) + """ + #print("send_legacy_syslog BRULOR:", message) + try: + logger = _get_logger() + logger.info(message) + except Exception as e: + # Logger bir sebeple çökerse bile BRULOR satırını kaybetmeyelim + print("BRULOR:", message, f"(logger error: {e})") + + +def format_line(line_no: int, body: str) -> str: + """ + BRULOR satırını klasik formata göre hazırlar. + + Örnek: + line_no = 2, body = "Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094" + + "[ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094]" + + Not: + Burada "BRULOR" yazmıyoruz; syslog program adı zaten BRULOR olacak. + """ + return f"[{line_no:3d} {body}]" + + +def _format_version_3part(ver: str) -> str: + """ + __version__ string'ini "00.02.01" formatına çevirir. + Örnek: + "0.2.1" → "00.02.01" + """ + parts = (ver or "").split(".") + nums = [] + for p in parts: + try: + nums.append(int(p)) + except ValueError: + nums.append(0) + while len(nums) < 3: + nums.append(0) + return f"{nums[0]:02d}.{nums[1]:02d}.{nums[2]:02d}" + + +# ---------------------------------------------------------------------- +# Üst blok (header) üreticiler +# ---------------------------------------------------------------------- +def emit_header_version(line_no: int, now: datetime) -> int: + """ + 1. satır: versiyon + zaman bilgisi. + Örnek: + ************** 00.02.01 2025-11-22 18:15:00 ************* + """ + v_str = _format_version_3part(__version__) + body = f"************** {v_str} {now.strftime('%Y-%m-%d %H:%M:%S')} *************" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def emit_header_sun_and_system( + line_no: int, + sunrise: Optional[time], + sunset: Optional[time], + system_on: bool, + licence_id: int, +) -> int: + """ + 2. satır: Güneş bilgisi + Sistem On/Off + Lisans id. + + Örnek: + [ 2 Sunrise:07:39 Sunset:17:29 Sistem: On Lic:10094] + """ + sun_str = "" + if sunrise is not None: + sun_str += f"Sunrise:{sunrise.strftime('%H:%M')} " + if sunset is not None: + sun_str += f"Sunset:{sunset.strftime('%H:%M')} " + + sys_str = "On" if system_on else "Off" + body = f"{sun_str}Sistem: {sys_str} Lic:{licence_id}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +def _only_date(s: str) -> str: + """ + ISO tarih-zaman stringinden sadece YYYY-MM-DD kısmını alır. + Örn: '2025-09-23T16:33:10.687982+03:00' → '2025-09-23' + """ + if not s: + return "--" + s = s.strip() + if "T" in s: + return s.split("T", 1)[0] + return s + +def emit_header_season( + line_no: int, + season_ctrl: SeasonController, +) -> int: + """ + Sunrise satırının altına mevsim + (varsa) bahar tasarruf dönemi satırını basar. + + Beklenen format: + + BRULOR [ 3 season : Sonbahar 2025-09-23 - 2025-12-20 [89 pass:60 kalan:28] ] + BRULOR [ 4 bahar : 2025-09-23 - 2025-10-13 ] + + Notlar: + - Bilgiler SeasonController.info içinden okunur (dict veya obje olabilir). + - bahar_tasarruf True DEĞİLSE bahar satırı hiç basılmaz. + """ + + # SeasonController.info hem dict hem obje olabilir, ikisini de destekle + info = getattr(season_ctrl, "info", season_ctrl) + + def _get(field: str, default=None): + if isinstance(info, dict): + return info.get(field, default) + return getattr(info, field, default) + + # ---- 3. satır: season ---- + season_name = _get("season", "Unknown") + season_start = _only_date(_get("season_start", "")) + season_end = _only_date(_get("season_end", "")) + season_day = _get("season_day", "") + season_passed = _get("season_passed", "") + season_remain = _get("season_remaining", "") + + body = ( + f"season : {season_name} {season_start} - {season_end} " + f"[{season_day} pass:{season_passed} kalan:{season_remain}]" + ) + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # ---- 4. satır: bahar dönemi (SADECE aktifse) ---- + bahar_tasarruf = bool(_get("bahar_tasarruf", False)) + if bahar_tasarruf: + bahar_basx = _only_date(_get("bahar_basx", "")) + bahar_bitx = _only_date(_get("bahar_bitx", "")) + body = f"bahar : {bahar_basx} - {bahar_bitx}" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + return line_no + + +def emit_header_holiday( + line_no: int, + is_holiday: bool, + holiday_label: str, +) -> int: + """ + Tatil satırı (sunrise + season altına). + + Kurallar: + - Tatil yoksa (False) HİÇ satır basma. + - Tatil varsa: + [ 5 Tatil: True Adı: Cumhuriyet Bayramı] + """ + if not is_holiday: + return line_no + + label = holiday_label or "" + body = f"Tatil: True Adı: {label}" + send_legacy_syslog(format_line(line_no, body)) + return line_no + 1 + + +# ---------------------------------------------------------------------- +# Dışarıdan çağrılacak üst-blok helper +# ---------------------------------------------------------------------- +def emit_top_block( + now: datetime, + season_ctrl: SeasonController, +) -> int: + """ + F veya B modundan bağımsız olarak, her tick başında üst bilgiyi üretir. + + Sıra: + 1) Versiyon + zaman + 2) Sunrise / Sunset / Sistem: On/Off / Lic + 3) Mevsim bilgisi (SeasonController.to_syslog_lines() → sadeleştirilmiş) + 4) Tatil bilgisi (sadece tatil varsa) + 5) Bir sonraki satır numarasını döndürür (bina ısı satırları için). + """ + line_no = 1 + + # 1) Versiyon + line_no = emit_header_version(line_no, now) + + # Konfigten sistem ve lisans bilgileri + if cfg is not None: + licence_id = int(getattr(cfg, "BUILDING_LICENCEID", 0)) + system_onoff = int(getattr(cfg, "BUILDING_SYSTEMONOFF", 1)) + else: + licence_id = 0 + system_onoff = 1 + + system_on = (system_onoff == 1) + + # 2) Güneş + Sistem / Lisans + sunrise = season_ctrl.info.sunrise + sunset = season_ctrl.info.sunset + + line_no = emit_header_sun_and_system( + line_no=line_no, + sunrise=sunrise, + sunset=sunset, + system_on=system_on, + licence_id=licence_id, + ) + + # 3) Mevsim bilgisi (sunrise ALTINA) + line_no = emit_header_season(line_no, season_ctrl) + + # 4) Tatil bilgisi (sadece True ise) + line_no = emit_header_holiday( + line_no=line_no, + is_holiday=season_ctrl.info.is_holiday, + holiday_label=season_ctrl.info.holiday_label, + ) + + # Sonraki satır: bina ısı / dış ısı / F-B detayları için kullanılacak + return line_no + +def _fmt_temp(val: Optional[float]) -> str: + return "None" if val is None else f"{val:.2f}" + PUMP_SHORT_MAP = { + "circulation_a": "A", + "circulation_b": "B", + "circ_1": "A", + "circ_2": "B", + } + +def _short_pump_name(ch: str) -> str: + if ch in PUMP_SHORT_MAP: + return PUMP_SHORT_MAP[ch] + # sonu _a/_b ise yine yakala + if ch.endswith("_a"): + return "A" + if ch.endswith("_b"): + return "B" + return ch # tanımıyorsak orijinal ismi yaz + +def log_burner_header( + now: datetime, + mode: str, + season, + building_avg: Optional[float], + outside_c: Optional[float], + used_out_c: Optional[float], + fire_sp: float, + burner_on: bool, + pumps_on, + line_temps: Optional[Dict[str, Optional[float]]] = None, + ign_stats=None, + circ_stats=None, +) -> None: + """ + BurnerController'dan tek çağrıyla BRULOR bloğunu basar. + + - Önce üst blok (versiyon + güneş + mevsim + tatil) + - Sonra bina ısı satırı + - Dış ısı / used dış ısı + - Son satırda brülör ve pompaların durumu + """ + #print("log_burner_header CALLED", season) + # 1) Üst header blok + if season is None: + # SeasonController yoksa, sadece versiyon ve zaman bas + line_no = 1 + v_str = _format_version_3part(__version__) + body = f"************** {v_str} {now.strftime('%Y-%m-%d %H:%M:%S')} *************" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + else: + line_no = emit_top_block(now, season) + + # 2) Bina ısı satırı + if building_avg is None: + min_s = "None" + avg_s = "None" + max_s = "None" + else: + # Şimdilik min=avg=max gibi davranalım; ileride gerçek min/max eklenebilir + min_s = f"{building_min:5.2f}" + avg_s = f"{building_avg:5.2f}" + max_s = f"{building_max:5.2f}" + + # config’teki mod + cfg_mode = getattr(cfg, "BUILD_BURNER", "?") if cfg is not None else "?" + body = f"Build [{mode}-{cfg_mode}] Heats[Min:{min_s}°C Avg:{avg_s}°C Max:{max_s}°C]" + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # line_temps yoksa, burayı pas geç + if line_temps is not None: + # CONFIG'TEN ID'LERİ AL + outside_id = getattr(cfg, "OUTSIDE_SENSOR_ID", None) if cfg is not None else None + out_id = getattr(cfg, "BURNER_OUT_SENSOR_ID", None) if cfg is not None else None + ret_ids = getattr(cfg, "RETURN_LINE_SENSOR_IDS", []) if cfg is not None else [] + ret_map = getattr(cfg, "RETURN_LINE_SENSOR_NAME_MAP", {}) if cfg is not None else {} + line_no = 4 # dış ısı satırı numarası + + # 4: Dis isi + if outside_id and outside_id in line_temps: + t = line_temps.get(outside_id) + namex = getattr(cfg, "OUTSIDE_SENSOR_NAME", "Dis isi") if cfg is not None else "Dis isi" + msg = f"{namex:<15.15}: {_fmt_temp(t)}°C - {outside_id} " + send_legacy_syslog(format_line(line_no, msg)) + line_no += 1 + + # 5: Cikis isi + if out_id and out_id in line_temps: + t = line_temps.get(out_id) + namex = getattr(cfg, "BURNER_OUT_SENSOR_NAME", "Cikis isi") if cfg is not None else "Cıkıs isi" + msg = f"{namex:<15.15}: {_fmt_temp(t)}°C - {out_id} " + send_legacy_syslog(format_line(line_no, msg)) + line_no += 1 + + # 6..N: Donus isi X + namex = getattr(cfg, "RETURN_LINE_SENSOR_NAME_MAP",[]) + for sid in ret_ids: + if sid not in line_temps: + continue + t = line_temps.get(sid) + try: + namexx = ret_map.get(sid) + except: + namex = '???' + msg = f"{namexx:<15.15}: {_fmt_temp(t)}°C - {sid} " + send_legacy_syslog(format_line(line_no, msg)) + line_no += 1 + + # 3) Dış ısı / used dış ısı + out_str = "--" + used_str = "--" + if outside_c is not None: + out_str = f"{outside_c:5.2f}" + if used_out_c is not None: + used_str = f"{used_out_c:5.2f}" + usedxx = "Sistem Isı" + + #------------------------------------------------------------------ + # 9: Sistem Isı - Used + [WEEKEND_HEAT_BOOST_C, BURNER_COMFORT_OFFSET_C] + # ------------------------------------------------------------------ + used_val = used_out_c if used_out_c is not None else None + used_str = "None" if used_val is None else f"{used_val:.2f}" + + if cfv is not None: + w_val = float(getattr(cfv, "WEEKEND_HEAT_BOOST_C", 0.0) or 0.0) + c_val = float(getattr(cfv, "BURNER_COMFORT_OFFSET_C", 0.0) or 0.0) + else: + w_val = 0.0 + c_val = 0.0 + + # Sayıları [2, 1] gibi, gereksiz .0’sız yazalım + def _fmt_num(x: float) -> str: + if x == int(x): + return str(int(x)) + return f"{x:g}" + + sabitler_str = f"[w:{_fmt_num(w_val)} c:{_fmt_num(c_val)}]" + + body = f"{usedxx:<15.15}: {used_str}°C {sabitler_str} " + send_legacy_syslog(format_line(line_no, body)) + line_no += 1 + + # ------------------------------------------------------------------ + # 11: Brülör Motor satırı (MAX_OUTLET_C ile) + # ------------------------------------------------------------------ + if cfv is not None: + max_out = float(getattr(cfv, "MAX_OUTLET_C", 45.0) or 45.0) + else: + max_out = 45.0 + + if cfv is not None: + min_ret = float(getattr(cfv, "CIRCULATION_MIN_RETURN_C", 25.0) or 25.0) + else: + min_ret = 25.0 + + br_status = "" if burner_on else "" + br_flag = 1 if burner_on else 0 + ign_sw = 0 + ign_total = "00:00:00" + ign_today = "00:00:00" + if ign_stats: + ign_sw = ign_stats.get("switch_count", 0) + ign_total = ign_stats.get("total_on_str", "00:00:00") + ign_today = ign_stats.get("today_on_str", "00:00:00") + # Eski stile benzeteceğiz: + # [ 11 Brulor Motor : [0] 0 00:00:00 00:00:00 L:45.0 ] + body11 = ( + f"Brulor Motor : {br_status} " + f"[{br_flag}] {ign_sw} {ign_total} {ign_today} L:{max_out:.1f}" + ) + send_legacy_syslog(format_line(line_no, body11)) + line_no += 1 + # ------------------------------------------------------------------ + # 12: Devirdaim Motor satırı (CIRCULATION_MIN_RETURN_C ile) + # ------------------------------------------------------------------ + ch_to_logical = {} + pumps_on_list = list(pumps_on) if pumps_on else [] + + # --- circulation mapping: channel -> logical ('circ_1', 'circ_2') --- + ch_to_logical = {} + cfg_groups = getattr(cfg, "BURNER_GROUPS", {}) + # ileride çoklu brülör olursa buraya burner_id parametresi de geçirsin istersen + grp = cfg_groups.get(0, {}) + circ_cfg = grp.get("circulation", {}) or {} + + for logical_name, info in circ_cfg.items(): + ch = info.get("channel") + if ch: + ch_to_logical[ch] = logical_name + + # Config’te default=1 olan pompaları da topla (cfg_default_pumps) + cfg_default_pumps = [] + for logical_name, info in circ_cfg.items(): + ch = info.get("channel") + if ch and info.get("default", 0): + cfg_default_pumps.append(ch) + + # Kısa isim A/B istersek: + def _logical_to_short(name: str) -> str: + if name == "circ_1": + return "A" + if name == "circ_2": + return "B" + return name + + pump_count = len(cfg_default_pumps) + dev_status = "" if pump_count > 0 else "" + + pump_labels = [] + for ch in cfg_default_pumps: + logical = ch_to_logical.get(ch) + if logical is not None: + pump_labels.append(_logical_to_short(logical)) + else: + pump_labels.append(ch) + + pumps_str = ",".join(pump_labels) if pump_labels else "-" + cir_sw = 0 + cir_total = "00:00:00" + cir_today = "00:00:00" + if circ_stats: + cir_sw = circ_stats.get("switch_count", 0) + cir_total = circ_stats.get("total_on_str", "00:00:00") + cir_today = circ_stats.get("today_on_str", "00:00:00") + # [ 12 Devirdaim Mot: [0] 0 00:00:00 00:00:00 L:25.0] + body12 = ( + f"Devirdaim Mot: {dev_status} " + f"[{pump_count}] {br_flag}] {cir_sw} {cir_total} {cir_today} L:{pumps_str} {min_ret:.1f}" + ) + send_legacy_syslog(format_line(line_no, body12)) + line_no += 1 + + + return line_no + + + +# ---------------------------------------------------------------------- +# Örnek kullanım (standalone test) +# ---------------------------------------------------------------------- +if __name__ == "__main__": + # Bu blok sadece modülü tek başına test etmek için: + # python3 -m ebuild.io.legacy_syslog + if SeasonController is None: + raise SystemExit("SeasonController import edilemedi (test ortamı).") + + now = datetime.now() + # SeasonController.from_now() kullanıyorsan: + try: + season = SeasonController.from_now() + except Exception as e: + raise SystemExit(f"SeasonController.from_now() hata: {e}") + + next_line = emit_top_block(now, season) + + # Test için bina ısısını dummy bas: + body = "Bina Isı : [ 20.10 - 22.30 - 24.50 ]" + send_legacy_syslog(format_line(next_line, body)) diff --git a/ebuild/io/zrelay_driver.py b/ebuild/io/zrelay_driver.py new file mode 100644 index 0000000..4551b7c --- /dev/null +++ b/ebuild/io/zrelay_driver.py @@ -0,0 +1,362 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +__title__ = "relay_driver" +__author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' +__purpose__ = "GPIO röle sürücüsü + brülör grup soyutlaması" +__version__ = "0.4.0" +__date__ = "2025-11-22" + +""" +ebuild/io/relay_driver.py + +Revision : 2025-11-22 +Authors : Mehmet Karatay & "Saraswati" (ChatGPT) + +Amaç +----- +- Soyut kanal isimleri ile (igniter, circulation_a, ...) GPIO pin sürmek. +- config_statics.BURNER_GROUPS üzerinden brülör gruplarını yönetmek. +- Her kanal için: + * ON/OFF sayacı + * Son çalışma süresi + * Toplam çalışma süresi + * Şu anki çalışma süresi (eğer röle ON ise, anlık akan süre) + istatistiklerini tutmak. + +Kullanım +-------- +- Temel kanal API: + drv.channels() → ['igniter', 'circulation_a', ...] + drv.set_channel("igniter", True/False) + drv.get_stats("igniter") → RelayStats + drv.get_channel_state("igniter") → bool (şu an ON mu?) + +- Brülör grup API: + drv.burners() → [0, 1, ...] + drv.burner_info(0) → config_statics.BURNER_GROUPS[0] + drv.igniter_channel(0) → "igniter" + drv.all_pumps(0) → ['circulation_a', 'circulation_b', ...] + drv.enabled_pumps(0) → default=1 olan pompalar + drv.active_pumps(0) → şu anda gerçekten ON olan pompalar + +Bu API'ler burner.py ve legacy_syslog.py tarafından kullanılmak üzere tasarlanmıştır. +""" + +import time +from dataclasses import dataclass, field +from typing import Dict, Optional, Iterable, Tuple, List + +try: + import RPi.GPIO as GPIO + _HAS_GPIO = True +except ImportError: + _HAS_GPIO = False + +from .. import config_statics as cfg + + +# ------------------------------------------------------------------- +# İstatistik yapısı +# ------------------------------------------------------------------- +@dataclass +class RelayStats: + """ + Tek bir röle kanalı için istatistikler. + + - on_count : kaç defa ON'a çekildi + - last_on_ts : en son ON'a çekildiği zaman (epoch saniye) + - last_off_ts : en son OFF olduğu zaman (epoch saniye) + - last_duration_s : en son ON periyodunun süresi (saniye) + - total_on_s : bugüne kadar toplam ON kalma süresi (saniye) + """ + on_count: int = 0 + last_on_ts: Optional[float] = None + last_off_ts: Optional[float] = None + last_duration_s: float = 0.0 + total_on_s: float = 0.0 + + def on(self, now: float) -> None: + """ + Kanal ON'a çekildiğinde çağrılır. + Aynı ON periyodu içinde tekrar çağrılırsa sayaç artmaz. + """ + if self.last_on_ts is None: + self.last_on_ts = now + self.on_count += 1 + + def off(self, now: float) -> None: + """ + Kanal OFF'a çekildiğinde çağrılır. + Son ON zamanına göre süre hesaplanır, last_duration_s ve total_on_s güncellenir. + """ + if self.last_on_ts is not None: + dur = max(0.0, now - self.last_on_ts) + self.last_duration_s = dur + self.total_on_s += dur + self.last_on_ts = None + self.last_off_ts = now + + def current_duration(self, now: Optional[float] = None) -> float: + """ + Kanal şu anda ON ise, bu ON periyodunun şu ana kadarki süresini döndürür. + OFF ise 0.0 döner. + """ + if self.last_on_ts is None: + return 0.0 + if now is None: + now = time.time() + return max(0.0, now - self.last_on_ts) + + +# ------------------------------------------------------------------- +# Ana sürücü +# ------------------------------------------------------------------- +class RelayDriver: + """ + Basit bir röle sürücüsü. + + - Soyut kanal isimleri: RELAY_GPIO dict'indeki anahtarlar + - Brülör grup API'si: + * burners() → mevcut brülör id listesi + * burner_info(bid) → config_statics.BURNER_GROUPS[bid] + * igniter_channel(bid) → ateşleme kanal adı + * set_igniter(bid, state) + * set_pump(bid, pump_name, state) + * enabled_pumps(bid) → default=1 olan isimler (konfig default) + * all_pumps(bid) → tüm pompa isimleri + * active_pumps(bid) → şu anda ON olan pompa isimleri + """ + + def __init__(self, onoff=False) -> None: + print("RelayDriver yükleniyor…") + + # Konfigten kanal → GPIO pin map + self._pin_map: Dict[str, int] = dict(getattr(cfg, "RELAY_GPIO", {})) + + # Her kanal için istatistik objesi + self._stats: Dict[str, RelayStats] = { + ch: RelayStats() for ch in self._pin_map.keys() + } + + # Brülör grupları + self._burner_groups: Dict[int, dict] = dict(getattr(cfg, "BURNER_GROUPS", {})) + + if not self._pin_map: + raise RuntimeError("RelayDriver: RELAY_GPIO boş.") + + if _HAS_GPIO: + GPIO.setmode(GPIO.BCM) + GPIO.setwarnings(False) # aynı pini yeniden kullanırken uyarı verme + for ch, pin in self._pin_map.items(): + GPIO.setup(pin, GPIO.OUT) + GPIO.output(pin, GPIO.LOW) + else: + print("⚠️ GPIO bulunamadı, DRY-RUN modunda çalışıyorum.") + + # Başlangıçta HER ŞEYİ KAPALIYA ÇEK + try: + if onoff: + self.all_off() + except Exception: + # Çok dert etmeyelim, en kötü GPIO yoktur, vs. + pass + # ----------------------------------------------------- + # Temel kanal API + # ----------------------------------------------------- + def channels(self) -> Iterable[str]: + """ + Mevcut kanal isimlerini döndürür. + """ + return self._pin_map.keys() + + def channel_pin(self, channel: str) -> Optional[int]: + """ + Verilen kanalın GPIO pin numarasını döndürür. + """ + return self._pin_map.get(channel) + + def set_channel(self, channel: str, state: bool) -> None: + """ + Belirtilen kanalı ON/OFF yapar, GPIO'yu sürer ve istatistikleri günceller. + """ + if channel not in self._pin_map: + return + pin = self._pin_map[channel] + now = time.time() + + if _HAS_GPIO: + GPIO.output(pin, GPIO.HIGH if state else GPIO.LOW) + + st = self._stats[channel] + if state: + st.on(now) + else: + st.off(now) + + def get_stats(self, channel: str) -> RelayStats: + """ + Kanalın istatistik objesini döndürür. + """ + return self._stats[channel] + + def get_channel_state(self, channel: str) -> bool: + """ + Kanal şu anda ON mu? (last_on_ts None değilse ON kabul edilir) + """ + st = self._stats.get(channel) + if st is None: + return False + return st.last_on_ts is not None + + # ----------------------------------------------------- + # Tüm kanalları güvenli moda çek + # ----------------------------------------------------- + def all_off(self) -> None: + """ + Tüm röle kanallarını KAPALI (LOW) yapar ve istatistikleri günceller. + Özellikle: + - Uygulama başlatıldığında "her şey kapalı" garantisi + - Çıkış/KeyboardInterrupt anında güvenli kapanış için kullanılır. + """ + now = time.time() + for ch, pin in self._pin_map.items(): + if _HAS_GPIO: + GPIO.output(pin, GPIO.LOW) + # stats güncelle + st = self._stats.get(ch) + if st is not None: + st.off(now) + + # ----------------------------------------------------- + # Brülör grup API + # ----------------------------------------------------- + def burners(self) -> Iterable[int]: + """ + Mevcut brülör id'lerini döndürür. + """ + return self._burner_groups.keys() + + def burner_info(self, burner_id: int) -> Optional[dict]: + """ + İlgili brülörün BURNER_GROUPS içindeki konfig dict'ini döndürür. + """ + return self._burner_groups.get(burner_id) + + def igniter_channel(self, burner_id: int) -> Optional[str]: + """ + Brülörün igniter kanal adını döndürür. + """ + info = self.burner_info(burner_id) + if not info: + return None + return info.get("igniter", None) + + def all_pumps(self, burner_id: int) -> Iterable[str]: + """ + Konfigte tanımlı tüm pompa kanal adlarını döndürür (circulation altı). + """ + info = self.burner_info(burner_id) + if not info: + return [] + circ = info.get("circulation", {}) + # Her pompa için { "channel": "circulation_a", "pin": 26, "default": 1 } beklenir. + return [data["channel"] for _, data in circ.items()] + + def enabled_pumps(self, burner_id: int) -> Iterable[str]: + """ + Konfigte default=1 işaretli pompa kanal adlarını döndürür. + Bu, sistem açıldığında / ısıtma başladığında devreye alınacak default pompaları temsil eder. + """ + info = self.burner_info(burner_id) + if not info: + return [] + circ = info.get("circulation", {}) + return [ + data["channel"] + for _, data in circ.items() + if int(data.get("default", 0)) == 1 + ] + + def active_pumps(self, burner_id: int) -> Tuple[str, ...]: + """ + Şu anda gerçekten ON olan pompa isimlerini döndürür. + (GPIO'da HIGH durumda olan kanallar; RelayStats.last_on_ts None değilse ON kabul edilir) + """ + info = self.burner_info(burner_id) + if not info: + return tuple() + circ = info.get("circulation", {}) + active: List[str] = [] + for pname, pdata in circ.items(): + ch = pdata.get("channel") + if ch in self._stats and self._stats[ch].last_on_ts is not None: + active.append(pname) + return tuple(active) + + def set_igniter(self, burner_id: int, state: bool) -> None: + """ + İlgili brülörün igniter kanalını ON/OFF yapar. + """ + ch = self.igniter_channel(burner_id) + if ch: + self.set_channel(ch, state) + + def set_pump(self, burner_id: int, pump_name: str, state: bool) -> None: + """ + Belirtilen brülörün belirtilen pompasını ON/OFF yapar. + pump_name: BURNER_GROUPS[..]["circulation"][pump_name] + """ + info = self.burner_info(burner_id) + if not info: + return + circ = info.get("circulation", {}) + if pump_name in circ: + ch = circ[pump_name]["channel"] + self.set_channel(ch, state) + + # ----------------------------------------------------- + # Yardımcı: özet + # ----------------------------------------------------- + def summary(self) -> str: + """ + Kanallar ve brülör gruplarının kısa bir özetini döndürür (debug amaçlı). + """ + lines: List[str] = [] + chans = ", ".join(sorted(self._pin_map.keys())) + lines.append(f"Kanallar: {chans}") + + lines.append("Brülör grupları:") + for bid, info in self._burner_groups.items(): + name = info.get("name", f"Burner{bid}") + loc = info.get("location", "-") + ign = info.get("igniter", "igniter") + circ = info.get("circulation", {}) + pumps = [] + defaults = [] + for pname, pdata in circ.items(): + ch = pdata.get("channel", "?") + pumps.append(f"{pname}->{ch}") + if int(pdata.get("default", 0)) == 1: + defaults.append(pname) + lines.append( + f" #{bid}: {name} @ {loc} | igniter={ign} | " + f"pumps={pumps} | default_on={defaults}" + ) + return "\n".join(lines) + + # ----------------------------------------------------- + # Temizlik + # ----------------------------------------------------- + def cleanup(self) -> None: + """ + GPIO pinlerini serbest bırakır. + """ + if _HAS_GPIO: + GPIO.cleanup() + + +if __name__ == "__main__": + drv = RelayDriver() + print("\n🧰 RelayDriver Summary") + print(drv.summary()) diff --git a/ebuild/reloader.py b/ebuild/reloader.py new file mode 100644 index 0000000..198fa9f --- /dev/null +++ b/ebuild/reloader.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +""" ebuild/reloader.py + +İki ayrı konfigürasyon modülünü (config_statics, config_variables) +izleyen ve dosya değişikliklerinde importlib.reload çağıran yardımcı sınıf. +""" + +import os +import importlib + +from . import config_statics as cfg_s +from . import config_variables as cfg_v + + +class ConfigReloader(object): + """ Statik ve dinamik config dosyalarını izler. + + maybe_reload() çağrıldığında: + - Değişmiş dosyaları yeniden yükler + - Hangi grubun değiştiğini dict olarak döner. + """ + + def __init__(self): + self._statics_path = None + self._statics_last = None + + self._vars_path = None + self._vars_last = None + + # Statics + try: + p = getattr(cfg_s, "__file__", None) + if p and p.endswith((".pyc", ".pyo")): + p = p[:-1] + self._statics_path = os.path.abspath(p) if p else None + self._statics_last = ( + os.path.getmtime(self._statics_path) + if self._statics_path else None + ) + except Exception: + self._statics_path, self._statics_last = None, None + + # Variables + try: + p = getattr(cfg_v, "__file__", None) + if p and p.endswith((".pyc", ".pyo")): + p = p[:-1] + self._vars_path = os.path.abspath(p) if p else None + self._vars_last = ( + os.path.getmtime(self._vars_path) + if self._vars_path else None + ) + except Exception: + self._vars_path, self._vars_last = None, None + + def _check_and_reload(self, path_attr, last_attr, module): + path = getattr(self, path_attr) + if not path: + return False + + try: + cur = os.path.getmtime(path) + except Exception: + return False + + last = getattr(self, last_attr) + if last is None or cur > last: + try: + importlib.reload(module) + setattr(self, last_attr, os.path.getmtime(path)) + return True + except Exception: + return False + + return False + + def maybe_reload(self): + """ Değişiklik algılanırsa ilgili config'i yeniden yükler. + + return: + { + "statics_changed": bool, + "variables_changed": bool, + } + """ + statics_changed = self._check_and_reload( + "_statics_path", "_statics_last", cfg_s + ) + variables_changed = self._check_and_reload( + "_vars_path", "_vars_last", cfg_v + ) + return { + "statics_changed": statics_changed, + "variables_changed": variables_changed, + } diff --git a/ebuild/runtime/__init__.py b/ebuild/runtime/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/ebuild/runtime/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/ebuild/runtime/main.py b/ebuild/runtime/main.py new file mode 100644 index 0000000..90482f4 --- /dev/null +++ b/ebuild/runtime/main.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +""" ebuild/runtime/main.py + +Uygulamanın ana döngüsü için iskelet. +Şu an sadece config reloader'ı test eder. +""" + +from ..reloader import ConfigReloader + + +def main() -> None: + """ ebuild ana çalışma fonksiyonu (iskelet). + + Gerçek sistemde: + - ConfigReloader izlenir + - Building + Environment + Systems kurulup döngü içinde çalıştırılır. + """ + reloader = ConfigReloader() + result = reloader.maybe_reload() + print("Config kontrol sonucu:", result) + + +if __name__ == "__main__": + main() diff --git a/ebuild/tools/__pycache__/relay_test.cpython-39.pyc b/ebuild/tools/__pycache__/relay_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec0f00f50c12ac9a8c5e808e4438386e2543aa1d GIT binary patch literal 3481 zcmZWrO>7&-6`uVecS%vQ{w&)`TyJb66^n|J-S(o?apKr=9Ve0@D=D%-L98?*X`$sV zGrOylECsZ&+n$U9J+?M1T@v(E=wdX0ZrvH$D)X4Usr^J?SN0%X!1OcpuaFQ!nu^I@9lNddcm3E7kNJxNN!m zED%o94;}I1X&@RR_Cw#<7S5{dJ`cLjq_ZK@X5h(#{qSJliM>sadk$^mK;_!Oe!DPN zyHcBLm#@xU{oc%#D>GN;zJgx1Sk*FnshRju=mlTtpnx#6Ojh2M{83xa2 zi&Y~t6Tcy{LL3Ou%*O7D)@tNQekV+X#Nm>vCX3MdJ0=NDU(e2NMh!8$m3wbitfqdz z`>!O5f_V1G*|laXE7q0fZ;^3iCDU|mM5}0W81ugqfw6yH?@j)Ey=rDfu3V5=QCL^D z+0pvCnn?@HYlf1^hXP*oS7-kWlLQ#2`%iHGU44%|&~}WD5nl#fCptIovyO3-{pkH2 z6Ew49{+98=6NAzZF#urBd8qgORp7p^NNjFXPl))XS#P}Kq>TFqB^*`uz=;BBaW@Nye4jAE61JS zLe`X6I!9JqyLK(NVqkwK?(Nww&qZ zTkpT~asBqaJ4?=L^y2CDYHcyC&_*wR@oU5s&N%P1Ega`9oM$B^%nYvB`O3n=LV8I_ zJ^pzvT8<{z4<`qW@8kkb=*i_KE48S{0atU*}$i%*_x@_+9>9> zPGeb@Q&{cok(E{vh(gwVKCqnvs7XqC4<+cs;H)830W!A7b^x!Axvj~|iN>{#1`z5w zz!X5SdXDWBI)z=GBT3Wx6MawLDJn{lTbNsrw3TG3Q-plEV__V6V&(AXl|x8te0UJ9 zkQ*6TJJnn3hX8il({}8R9X|u-C~<}yv$2j%Rwzju0d#Mt1nPLFgk2{NgQJLZm9U?o zLP&9gYf^EYKEZXW$E9}uL?xp{?yggCAdBTtLjtY5Y$35~bnYgr=QW%gOJ(}s@ zI+Stcm&gEzhr5(cf>B+jefniZOKD<{*&kV+f5A@6}L{w@YqvXLxC zRk|40D*9^%B@m)vG|EUNWqm|(^hczU3y`boQrV-j#$ZXO5=T{6m9;h|M`i5++d;md z(uN2#I%wxOTDeCm-V!u&K6_y7=p9{t)IrOaYV_{t+f06xP;62IW^wzGiKw=rwM6mU zFJI7WDZR)eMCS}mLS-?ftT@n|IIZsUtw5kcMe^lOKi^na&)=?Zd`CThx{h-lW?*;t zSg6Pm=#m7>s*xZ5kTd-N)bh)RUsCZoCZtLY`mUDeSq_HnGVfrF)&Ax`*IeINuK6sTD_xS0*l z4?o31Oo@O2Lq#BJ#HeVK+PH3`JlQBASjp^qop|eY^lOBv^i2%qyD3@@S zlflSUTPXJd_rIO@CUmmi(Q%^uQdPuue|fOKb+G^9X$?1eba8`oO%iUa=dw~AEgHOA zuV>|Y-Aj|rNMb%zNBGHR6w?Ae(A&nyZTNu2+)F@~R3Ecq(n6!XA*mU5Px(|@B9{Pjg7uqTH None: + try: + time.sleep(s) + except KeyboardInterrupt: + raise + + +def test_all_channels(driver: RelayDriver, on_time: float = 1.0, off_time: float = 0.5) -> None: + """ + Tüm röle kanallarını sırayla: + - ON (on_time saniye) + - OFF (off_time saniye) + yaparak test eder. + """ + print("\n=== Tüm kanalların sırayla test edilmesi ===") + channels = sorted(driver.channels()) + if not channels: + print("⚠️ Tanımlı kanal yok (RELAY_GPIO boş?).") + return + + for ch in channels: + print(f"\n→ Kanal: {ch} -> ON") + driver.set_channel(ch, True) + _sleep(on_time) + + print(f"→ Kanal: {ch} -> OFF") + driver.set_channel(ch, False) + _sleep(off_time) + + print("\n✅ Kanal döngüsü tamamlandı.\n") + + +def test_burner(driver: RelayDriver, burner_id: int, on_time: float = 1.0, off_time: float = 0.5) -> None: + """ + Belirli bir brülör grubunu test eder: + + - Igniter ON/OFF + - default pompalar ON/OFF + + Burner grubu bilgisi config_statics.BURNER_GROUPS'tan gelir. + """ + burners = driver.burners() + if burner_id not in burners: + print(f"⚠️ Burner id {burner_id} tanımlı değil.") + return + + info = burners[burner_id] + name = info.get("name", f"Burner{burner_id}") + loc = info.get("location", "-") + + print(f"\n=== Brülör Testi: #{burner_id} - {name} @ {loc} ===") + + # Igniter test + print("\n→ Igniter ON") + driver.set_igniter(burner_id, True) + _sleep(on_time) + print("→ Igniter OFF") + driver.set_igniter(burner_id, False) + _sleep(off_time) + + # Default pompalar + enabled_pumps = driver.enabled_pumps(burner_id) + if not enabled_pumps: + print("⚠️ Bu brülör için default (default=1) pompa tanımlı değil.") + else: + print(f"\nDefault pompalar: {enabled_pumps}") + for pname in enabled_pumps: + print(f"\n→ Pompa {pname} ON") + driver.set_pump(burner_id, pname, True) + _sleep(on_time) + print(f"→ Pompa {pname} OFF") + driver.set_pump(burner_id, pname, False) + _sleep(off_time) + + print(f"\n✅ Brülör #{burner_id} testi tamamlandı.\n") + + +def main(burner_id: Optional[int] = 0) -> None: + print("RelayDriver yükleniyor…") + drv = RelayDriver() + drv.summary() + + # Önce tüm kanalları hızlıca test et + test_all_channels(drv, on_time=0.7, off_time=0.3) + + # Eğer config'te burner grubu varsa, onu da test et + burners = getattr(cfg_s, "BURNER_GROUPS", {}) + if burners and burner_id is not None and burner_id in burners: + test_burner(drv, burner_id=burner_id, on_time=1.0, off_time=0.5) + else: + print("\nℹ️ BURNER_GROUPS boş veya burner_id geçersiz; brülör test atlandı.\n") + + print("Tüm röle testleri bitti. Tüm kanalları kapatıyorum…") + drv.all_off() + print("✅ Röleler güvenli moda alındı.") + + +if __name__ == "__main__": + try: + main(burner_id=0) + except KeyboardInterrupt: + print("\nKullanıcı tarafından kesildi, röleler kapatılıyor…") + try: + drv = RelayDriver() + drv.all_off() + except Exception: + pass + print("Çıkış.") diff --git a/ebuild_building_log.sql b/ebuild_building_log.sql new file mode 100644 index 0000000..f898876 --- /dev/null +++ b/ebuild_building_log.sql @@ -0,0 +1,3 @@ +-- DBText log file for table ebrulor_log +-- created at 2025-11-20T18:55:06.091200 + diff --git a/ebuild_burner_log.sql b/ebuild_burner_log.sql new file mode 100644 index 0000000..51e38ae --- /dev/null +++ b/ebuild_burner_log.sql @@ -0,0 +1,198 @@ +-- DBText log file for table eburner_log +-- created at 2025-11-20T20:45:06.451003 + +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:45:06', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:45:06', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:mode=F avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:45:06', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:mode=F avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:45:06', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:mode=F avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:45:06', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'mode=F avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:45:16', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:15', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:15', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:15', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:15', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:15', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:20', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:25', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:30', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:35', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:40', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:45', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:50', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-20 20:56:55', 'EBURNER', 'burner', 'relay_error', NULL, NULL, '0'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:10:22', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:10:22', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:10:22', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:10:22', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:43:03', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:43:03', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:43:03', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:43:03', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:48:46', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:48:46', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:48:46', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:48:46', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:58:48', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:58:48', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:58:48', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:58:48', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:59:49', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:59:49', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:59:49', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 13:59:49', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:00:50', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:00:50', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:00:50', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:00:50', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:09:38', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:09:38', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:09:38', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:09:38', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:10:38', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:10:38', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:10:38', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:10:38', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:19:25', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:19:25', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:19:25', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:19:25', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:20:33', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:20:33', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:20:33', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:20:33', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:24:26', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:24:26', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:24:26', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:24:26', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:25:35', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:25:35', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:25:35', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:25:35', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:37:42', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:37:42', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:37:42', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:37:42', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:38:42', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:38:42', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:38:42', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:38:42', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:51:23', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:51:23', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:51:23', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:51:23', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:52:14', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:52:14', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:52:14', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 14:52:14', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 15:18:00', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 15:18:00', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 15:18:00', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 15:18:00', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:24', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:24', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:24', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:24', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:54', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:54', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:54', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:18:54', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:19:55', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:19:55', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:19:55', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:19:55', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:24:58', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:24:58', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:24:58', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:24:58', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False cfg=F'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:33:10', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:33:10', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:33:10', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 16:33:10', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:19:04', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:19:04', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:19:04', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:19:04', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:24:01', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:24:01', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:24:01', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:24:01', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:50:28', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:50:28', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:50:28', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:50:28', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:51:30', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:51:30', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:51:30', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:51:30', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:58:59', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:58:59', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:58:59', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 17:58:59', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:09:40', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:09:40', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:09:40', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:09:40', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:23:41', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:23:41', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:23:41', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:23:41', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:37:24', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:37:24', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:37:24', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:37:24', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:43:05', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:43:05', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:43:05', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 18:43:05', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:00:16', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:00:16', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:00:16', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:00:16', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:02:44', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:02:44', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:02:44', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:02:44', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:03:45', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:03:45', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:03:45', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:03:45', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:10:53', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:10:53', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:10:53', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:10:53', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:23:45', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:23:45', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:23:45', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:23:45', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 44.000, '°C', 'avg=NoneC outside=10.0C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:50:54', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.312C used=19.312C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:50:54', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.312C used=19.312C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:50:54', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.312C used=19.312C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 19:50:54', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 35.000, '°C', 'avg=NoneC outside_raw=22.312C used=19.312C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:11:38', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.687C used=19.687C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:11:38', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.687C used=19.687C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:11:38', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.687C used=19.687C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:11:38', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 35.000, '°C', 'avg=NoneC outside_raw=22.687C used=19.687C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:02', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:02', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:02', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:02', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 35.000, '°C', 'avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:16', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.812C used=14.073406354148933C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:16', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.812C used=14.073406354148933C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:16', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.812C used=14.073406354148933C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:51:16', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 39.000, '°C', 'avg=NoneC outside_raw=22.812C used=14.073406354148933C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:22', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:22', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:22', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:22', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 35.000, '°C', 'avg=NoneC outside_raw=22.875C used=19.875C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:36', 'EBURNER', 'relay:igniter', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=14.07425982530695C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:36', 'EBURNER', 'relay:circulation_a', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=14.07425982530695C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:36', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=22.875C used=14.07425982530695C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 20:57:36', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 39.000, '°C', 'avg=NoneC outside_raw=22.875C used=14.07425982530695C want_heat=False'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:09:00', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:09:00', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:09:00', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:09:00', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 45.000, '°C', 'avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:41:46', 'EBURNER', 'relay:igniter', 'state', 1.000, 'bool', 'F:avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:41:46', 'EBURNER', 'relay:circulation_a', 'state', 1.000, 'bool', 'F:avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:41:46', 'EBURNER', 'relay:circulation_b', 'state', 0.000, 'bool', 'F:avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); +INSERT INTO eburner_log (ts, app, source, event_type, value, unit, extra) VALUES ('2025-11-22 21:41:46', 'EBURNER', 'burner:mode=F', 'fire_setpoint', 45.000, '°C', 'avg=NoneC outside_raw=10.0C used=7.0C want_heat=True'); diff --git a/listtilda.sh b/listtilda.sh new file mode 100644 index 0000000..a6a908b --- /dev/null +++ b/listtilda.sh @@ -0,0 +1 @@ +find . -type f -name '*~' diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b9705eb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,23 @@ +# ebuild – Raspberry Pi 2 runtime dependencies +# +# Not: Bazı paketler Raspbian üzerinde zaten sistem paketi olarak gelebilir. +# Buradaki liste, tipik bir Python 3 kurulumunda pip ile yüklenebilecek +# kütüphaneleri içerir. + +RPi.GPIO>=0.7.0 +gpiozero>=1.6.2 + +# DHT11 / DHT22 ve benzeri sensörler için +adafruit-circuitpython-dht>=4.0.0 +Adafruit-Blinka>=8.0.0 + +# MCP3008 vb. SPI ADC için +adafruit-circuitpython-mcp3xxx>=1.0.0 + +# Zaman / saat dilimi vb. yardımcılar +pytz>=2024.1 + +# İleride log işleme / debug kolaylığı için (opsiyonel) +psutil>=5.9.0 +astral +holidays diff --git a/run_burner.sh b/run_burner.sh new file mode 100644 index 0000000..9dfeffb --- /dev/null +++ b/run_burner.sh @@ -0,0 +1 @@ +python3 -m ebuild.core.systems.burner diff --git a/scripts/run_ebuild_main.py b/scripts/run_ebuild_main.py new file mode 100644 index 0000000..adffb9b --- /dev/null +++ b/scripts/run_ebuild_main.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""Komut satırından ebuild.runtime.main modülünü çalıştırmak için yardımcı script.""" +from ebuild.runtime.main import main + +if __name__ == "__main__": + main() diff --git a/tail_burner.sh b/tail_burner.sh new file mode 100644 index 0000000..58dddce --- /dev/null +++ b/tail_burner.sh @@ -0,0 +1 @@ +tail -f /var/log/syslog | grep BRULOR diff --git a/tests/__pycache__/relay_test.cpython-39.pyc b/tests/__pycache__/relay_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..693949007a61b44da0124c9c213ad8d4ca9df575 GIT binary patch literal 3474 zcmZWrO>7&-6`uVecS%vQ{w&)`TyJb66^n|J-S(o?apKr=9Ve0@D=D%-u~=zF(n8B6 zGrOylECsZ&+n$U9J+?M1T@v(E=wdX0Z4c{e?aTpCNp_jeqjzG!%6a2T|Z`3uje!pNHLN(%Fz{GxX)besr+!#QvtweTTMjpmObCzg?KC zU8&8r%U9>FesAW=m6@w^UqLThtZJFP)J%d#%oQ> zC$MZSuIiZ83xa2 zi&Y~tlb|lLLL3Uw%*O7D)@s9-{7#eziNhsTO%|c^cT5tRzMh`lY}CcV|0x8GUz(dxpAL$jGOF7@9&tP znH}@Dj2E65v<3;IWAfsj4tcYa>tWndJoYi3QjbUJ{A3!M%6;wCq4Z}kr0n2X={~PJ zQo(1-#~mMG>t*y3gb8b0_iZem(Rfez0FFR|{F8DT64>dXI|Wdal=L3T%!g4~LyQ7sY>({#ULA8=la~{XYaIr{_R?fl6f!8fJObLPks)wAjE;XwuH8zKy37&xneJeGM^(N0~9X~4>?Jm6wE0iMj*5J{c@g8Y(I0?39%_EJ}N~+8tT5rg+n7Rg>FVEAg(4<>AnKp)0+Q?fS-d)bpq7IM-nYc88CJ ziX4G1NwBOM`QZ;a(+@x`zkK*56`x~5s??z2YWYs?dL&)MTlWhg96#yT zj&vRx2Wl`aheA>cNs^#;vM{2~HT~pZAID1TI9Pfa;)GAt07B3~f!Y=ka!|d&eaA;_ zR7I+4D@;mC{H_(J^|~)xs#s(eVCpA{%nEDkXyVkhXBO2R)bgGSGK0%)Nl-iqH?!^s z(Wh95DG@MWs0c)j7!_?&8`o`=CmSUME1B(i#Orxz)Cg1Qn;6P>Q?wk&H|RkTPSRf| zgORJYQ0_w>d^_(==w!X4<3#zTs)+6W@?d}KVE@I_8gBIH;s)oMB-~cdxg`%R8ocXy zS=saaG}&xO&vS=7gr96SVp_lln%Wq-4J)vi`w7UB>SI<+TIjGhBz3{=si0BI+sM2Z zRG!V4q*hP9PV9yCu;C{v=5t3IXc3fm5B)*$3+`~|BdGO?Rxw7csdHy%rY3DI?`P>

S?+ppA9 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˝y zs$f!wL$iZgyzdkVUgGn&5>dr)-x*UL}9BwSSORl5pq3K+4o#Ci8BY~7icu(IpZ z3sqE_Pi5AsL-`ZBv>Bsn z08>y$sDxZ3q2JIiV$%tkEO4tEM{Z!<`3r3qedz3KYm7kge&TX;O~x8xJVacyws7&l zYBm3JQC@ei_qPWkOdRu+Nyb{PZ0gd7Aq?ExF!TAwh6x&R4^*qgkrytCgi@Jqe``lP z4;+I&uyy|q7cY96NWcHqcgRBq_j0b864Cc1YAze0J`wJdjD#fwGtelIHE+V*DMNp) z=p7YH^Xb`|#*$i~V^>n&?hIFiMhH7*H?<3tFI2+ViccH=Ol$KT*HW2PLYpfvHXfBs zCdNg@LXxrYC`rg&&680@a5&$kXTh`Fn=la!WZ3^~|JFcarC7bz%(mYmQZZO%8?sHL} z~Ov}d<$@M zo0^@K1+VE7AlnfNA!|>yJcMvMzAVTc^gT*8di1?CzsOAXF35&maMAB9nTa5e%!V=K z=+?^Y&f#1wZi)6!kKtw(di$cMl~N82CZY-<4}9F8vmB219({tw%De{-JfRH$Z^ zdO5N8cg#O{u>WVcRn4QotBG1GtH-x=hA$1%j|p|!|%rx3%-sj6qZV&Rx$_Clvt6V|NeiKi2qx8Ds& z#~W$c_sQe+&rKryNBGci4v6(XmSQ;yt2PwZLK*aHS6&RtR42L6sJMqKc1kvw?G z8q_8ETMZb{Vg-M_AP<>?e2lL~sXfEMnz_?9S`e>p_!Hb@ucIQAP=2F0SOV zw}DyW+e0Qk9_HF>XZA$sX06JgEgjC(h1VJ2F?%@8(r2B9V$N(1+-#4ha~_hwQTJ%& z@qPs!Mx~CV26ot-|Duv?N3x4`v+G!^qLaQ@`nturhF-Kfpt_jthgy;!gp z1Dd&q7!dkzT`>df%}?#OONS?5OQ`{Quzd$T8B#|?kj#hYue=-f@89^(FMp^KbG2K! z0AxFO4ZhZHNf0g|1*dQ^XMn{!a9aYo*8k*7fIj&Z#9zCDk)3x-i%&-F{hX0Q&PlSG zRDfy~UWFkA@OYupSoaVg(eas5bpVlIrnnxEdA*UO?(uNF;>5J6{=cPg;QQWPl4vmo*$)g+N0SOuRZxN)a4`%ilX@Tkn!ZFsZ<* zT?Y-u5DXVOY^_g-M&S4~!wB%ly&xx1JA5BQ!XL91E0zsfpMm2(o7~A8D#FKzd$7ti zFx0Twg-r3!T_^|GVc~y+pj`AFP)nH)-9U0<>+td6(EYT;9s13!sp>I~>h0BS$D?<) z*De!$p9L4#Ie^1y$R=$H4ty_(ShCH0W)w*+hxtjGa)t_lr+J$BS(aw~Cb1byy zECkP(bTI475YNMFx8+5E0rxc6&9zm{mLQBMM(iWTHi_qw{#c`CSI>fJMV*Jx;L1lb zHOCdMm?A;?PF^BNi#k&Iy>-QNlj91?8dS)D8E$_6KPlZ|bD+DSA$gwIl&<(nMx`;P zHaZ&GOHD&e%;b&->Zg_YX^hG>^ORT~^0`lK6K4!PGWhE`LSHK%AraC1&pxb3=4+Mz&Za3 zmul#_A|ZdmE^|(LD651Z3HDSrRlr4zQiEFqbqKZL`_aY1@|{mRwAHv9jc%bBB+8n) z+1|SXUJLU(yStP*fr@d3c9zek)MwV68*G>4XQ!hfpEWFmi^w^mC)cEp2j0fkS)J>& z&VO>^eR}N_>Xb0Qo@9(c!XM~=*K(@e;zD(K_wcm2JFXV|xnIbL_1Jbi(Bv~He^m9& zX2|x*RtKQ|52nol8+_QTn*puTr&0taI)zJ=W6%pl*g#L9FzDE0OJOrmzPhiLD? zmwNWspONi5a&~SHReaAW$^Fl;K#m=!!k``73<(f=B3B+yq_aKG1YpDD%}zl#RKbvM zMfIvr=mtNSg`2!hAS8JB1Q7O5If!>yBHP;Hj>QL)j$D6YO2}6zFFL8Myfh*0vPMGZ z{ndb*uEl$alHSNSIrl3fDXs^lHhcgrc9-#^WMgD&s)?2o%}?txD-_;7?lVTIpzbq) z4y{az?+zXMmK9R8RsJ^-PgRV9p5TNqn!F*7f~`wEr$aDiVni86(>LQg(<%D3`9+J2 zV}$!fLa4Y_&AfK3R#RI8YAM}D&y+PTTek^W&_%rdE5f&*B;{#!i?*?l9@xGmIlbrnQ&EWmyv49XjLVp0LoB>Zac-%B|=JDa6_ zO92&!FD(bnXiRiUN(&=qy1KgBZC<)h^l_ztWvC96ne1ARrGa3s)_qHSrFhn$bj@>F zc{jJ6-B4d&KLCws@!|6t7*zW2Ev^>Ok$Tk?>lb@6vscBQ-2Gd>N%vguTqY@@y2VfB zS3N_`z3YXqfAQX8@q-T7d1FOy82icGN#WQ|_~Q>GcEP^GH;jGPKGGQ3=MnPdob2^q z?gbmgPNwz`VlSQTm+phD2$7-}JPpmQ7ggejx%%m@CL@mG54+-XLei-YkiVMYEuK;w z-J#p-g<(28{8})t0C@Q+_sEx`dC06zLA_!UUoWsrl5XqwF_(=Q?2N&Ek! zJY$N!!v*7imnUFvI0kwE&1?bqx4KgTYc4hj;cayL!ZSX_GedWwG zATkB&+Am$`=>v7z^4>xLIELC0r`J+I~P3a$zOV;>a90Kt8!G)&<% zKn1_;fChyNaz;3)T*iW1b<<*M9;5MSIRE-b6Rl_BQ=9>cqsW9h}w7t5olUQ<(l1*2vydC@Iich-l zK6u>pBAr38U|t^dMh;oyX$<7OwG=|}D|*fh?5ui{Uy{CXdeB<%tIXXIY-o)9PB_o|*jX4C`8y=5_|L$M(+*CtInI7J?1kqovImG}q6t3sg zO3}vy1PbBC&_T^a(-te8g^_SangL!O>^`YJD+7(xfMDQt6!ed?Kx7gnuxrlQgt5T{=a0I~?Zzo5FE zMbr4L={$QJ#&x)nN+{wcEK;bf$*R@scT3hc{Za&py8o&)k#X7grO9QwWKnadR4l8> zIPE275$zrGz+DK*X!oC!YWcq9uyGxY0KfGBd^!K$S zb#4=BJa>)zL;#0Kg+yWiNkHixL%v?8l^}$=P;xf>-49laY#&ylo#U%a0>XKYpi&&^ z&GYi#MDW3n5r7BoxC1EDPzihT+EE%=?ES#cJ({tM?t+SG&qym#A9VIih z1kr6K$TO%1@pb7@d0+}{2@R*FvFaHK?SXt$`Yq@Pg&Kmg>q$Es9Np^Vbo$-K16$?C z$trvh(k`VHZnb*9SqIHnqERS1$zbX*>D`cofv`^owjDgczYxqB3XgNZAC!=is;Z*$ za_iLf9U_a&+F@V#u@>Z!Es8hb-V^vS|6BjUU1|`CeQWJWcL&Sa9M6*HR+jM1cK!=u zo^VhO>gFhDYs(rN8*?u$yqC$nI#6^4PJ!16t$ZjLRfW%XrhXXPX0Exn*bbIY8keTHd&U262fifD)TpNv!#?^WRPXfi;3 zd+FH7v@|+~Uno|C@8_ZTIONxfDP|Kv;YJQ~;s}2p2m%!QLaF`XfI0oLV-RHSTZwo(k z!3%jegDZkafX#;whD1tPv^j$TmDSq^4E4R+U~oB&g$qWu?oP*L&ov&v*DCB zTZv-}v0EazZ_#c3k@vUWPaum_({A)QHs(qj!5DT!hBHFJJoQE>iQS(emg)jOJ?Y^%*hf8+2%uo%lx(Svw8P~xDC-A}W5eC!ryKGs3U$}sf z*qwO5v;Kh%`Ul(~*8wM$kG=J%8-x2d{2(MezNVgYqhU6e?Gbu5YPtRMyW`sTo859y zkI?M6tY!HJZ_R|GPTDr)>b+_fALQX-PaKRx_rb)JPG^i#GmGpc4A#IlX+X1@CZ?mK zhG5F(aZqzcoFexXG0O)hB{a|LpcYc+MqtSo?L-i>utLzkPbfGT+9k(%$O^~Ln?XLy zPveESY1mPUd@B3I6v{~-IbczDHI*-zTKJ{B`;=RjZeYEPh|`>PpKO2qQ<Igd!)m zt(1s~=RKo*uU$g6oq^v!M=u@SBM~VkCpS*?=x;BohD}=Lwdzd;zNInyY~)7Ka}j6I z${Gr;9P!MkWW zh$d;QQBk7Feji1|8?)<^{nd0rpR-plUP6;vp6acS6lFOkA|yBP%dQW3ZUGv3LujZ` z^uT+zFB0KfOvS=uNWyci$!22Lyneaj*v+X^^kSPIe&1yy4fA8qg%?^2%}vl;ZB$!K z6A{cVf>W5k3kk~y+rDvP9kiGAjgXF(Eh1EaBjtBJDu29ZQ)z2W5)K-zY-2U}9oo8w z0(0kkw;SX6XKYKmwKNQt9oN&|xtks5edwQnzP~rukQ;4X-4ZB6P-T1qGiYpdt@AMv zQZUr+oZ_|C=JaQiX?G%ZCSWr*Qb*ID!ZgN;==CCpNYyq;{?KxHhST@`4TM!qE~#2J zfiP`UFhRGqj~Q`st39odI!lR4{8KQ6cC$@)x>{h-7`bG^1b0Iu2TDmd!!|Qbiv;$# zg?hqKwExWqVJ0Ts&$W@vM2RGc47fY@N`{uj(hzqQG?SXzzG;WWc4T0!sm(3S*zMW+ z({@2`!809(Zg!AI*HAIv>4$Sk#g4lGv3yB|wA5Yqb>`<^t#`p+<%4>dTDq2AM)2WA z6@HbsWDma3Xl_F*Z|F95khe*E9+c2HjUdk`ykSzAOB!lNACgoule3@`Ty3l&ouH*q zfD^_0s)k4Zu_qUq+b9@KM`-s4frs77&f$a!h}>Ka|2*(Ol71)Yefx?q^=T^`z?V@8 zHZe5b?*E9QdE3Mw=^nyQJ$i`6$Ym-U zQZlsRlnEqS@JI6fdGUyD*MhCL|3pq>N3vkY-3GfeC=tDXcnI^qLIy)Jn`Ab{H|m$* z3IT*0Yv9^YF>A2j@%ZqV({_r{kk2~taLC5(Jk-YDmM9^iu&pHcH2FzT5E8Byp5Aa| z`N3{;`9U+wUfu4EuODQ$nNI`rLl1)dyT}Z&}#@T3TF@ zak0U+t<1E`%rt?^%q`#Lm7ky@h64|K!8O36Q3q^oc6%@+jbABR)4KV&27?sG$0L?HVR9&VM^0a4?EPYPALa!YsF)mq3v0r&8nqh2NEt=)-YrM}^uzrND!3I_Z-u zkYjuELvMNAUDw&KV@u?46~3U?4ZpI^S{pS_EU#*g1oKZ;i4qf8$K+E>OQZR*qVg$b zJ&vtQ3!b^Bb(LRJCifjZ7#Ne~dFqoE2~SuV)KK>ja&!g)dg3Io`yD^;?d!?P2_D8F zNxZcRVfIU5rj2=*UXT=*B+paVAdCHy?me1K1o95ulz;<5w73kWcc2SKA@7h76lDM% zkeB(-IGi^PUR=PmTiw{QHc-o9F4MAmXB7ldL;^9%OV%|W+1hukDx#;fI#N<{*~Zsp zcolkWf?qTXvEwmi@d(?pF)7Xs{@TRgrSMw+b{h9Rot-fJ$&3U!3_bRiQmwu!zEPgBx`n9+zRZQfBvfTUkw0#CE`8J(9(O6oX zXfp1m*+*=ar}A=j!ZLDzoq62VgWvT9#}n0nCJ_P|blJ1*6yboTV+KgQ+{|n^d}!UT z`N^0{bCZGY2XeU;2CdLl{r8HQ)6*RZJbTD%5j1l7bEZq7e)#MLJyX0aT3i#+?C-y? zt;%SnqfgDm@J9Pxh@4>JvuX{6@-Sd2c@eN0+h!*ae+AgncZpkPt*Zc#O z=}Yf+t#~iNOxe4FDnk@Ncb@uy9 zlNa7IW(I;FI*~m&mV^xv7EJj+f**fzqm^VN)$JQU3>ETF1FjWkZNMf+SKbeIqYxUW zpcaaQ!rT`MDZ+1+V-nJ(P9J2aJ=eW{+Fo85g={dyE-G!Z!92-t@1w6|Pqq`JdRS5> zCy2KEF1;a@@9tAF9yTZ}qtwn~nR0EAxvY(|o)FYfAjF;`{S6DUt)!D@$>bfNWtNwE zYix+yo4AUg!B|+cDWKdS{-^%MDyg8eMpA)-tmHwB7G}^an#<;KAEy?H=~WGuWG%G< zcRFm1Cb~&r%Cw}YPp0{!KEa@sI8|Ib6-sYq~(Q@cXj7YI3^q%9@`_rgFBqD!9=t z=I&Ls=!rQv^yleR+Nl+^i^xr}oqvQk(|sOqS1bk-=rZmfuDw7<)`~A91D8n55QuA| z$VJlG0Sd$C&ohdTAcPMu!u$iveV_V(Jj>}e|dSPOJoLzKT2OTfb-ObHzdJP^C z04;81c=!iYFz+-822&c^Ocp>n;nC;S_df`fU#~T*^akDAPs!jw&3DYnS3@7#5ujVs zD=QsJi8SNC!4cb_9RP}sh7BL;-b-AoDW0&EYM^?A>e{y@!`mS6Dhi>=_tj96EBHR} zs(Cw)fVIzu$#(CU!nmOWfHGI|tU7qNF2k{CUf-Wh{{TnTA4lD2pj!MFq^EMLtL^KJ zr^$}Voj?%R0X!yb__V=52GH*C>*l476u>=Ms=m*hP>7O-0*yd zbZkA2H~v+>Xa9Vc!KPTtmv3z%>wHPB(xUx|+}p&$ElzmjuXLqV+QJr1zw(d_XfHMe zN|kF)O#lA;4S!$4-|!WZwQXP4Y0jTgGnQ?V0nEPqEOBp@e{{7tJqCGE3?~TjMAXRf z$FvyCvSqSm5~__cv`sD^Z+cO%QE_ky61t@Rx_DS)79%WnP?mAI{ZKrx!;W<7uPxFHB>(| z+E@`ZO{8O}2(X^%Oc5}p$9GC5NYh$LV?}G#zmcC(i%372DWG9zA(o%ipd)tdd0ts+ z^`=_$tT&RCNnM3HU686WX&?_zgNKDBNqWaEPP5D_&G%vb}eGOLjw<|SY z=Ao;shq$byOr9QE!6DRUU+2V=G`h6ijp(}K?EmTg=~Z~A_x9ryy#ZP#?N>SB)$ge9 zC_g>1aD+j-CynW#?ih8Mgeq#0gxnR~epYNKE zM$KqfJh5l3nuGGl6j{9!A{wKoqCjAHbQQ5(ul}fiH}K?$Q2qMM60NJ35gi& z2-A93d7a;6dkF5b@TF0n(vO386HcZ>rR#7jOrA2NlQ{SYBQ*?#F=I$<6|D#C2nkgju1ZZezhynFo*vyorJWVbL&>%Ml8+ePfd z>+9LF%DKxF@=LY(sXac^ZhQ94f529Y_z^%j7Vc)@&REMz`1)gb=J(cQVO}n>G8vW* z)Qm^)L?sBvWWzhfl?!0$lu9pxyS5hE?!lKiyf1A2i&=tX&nZ|d?OPhT9sf#F(w4x> z-GK5&1cK;rdu=(?)q8qh*ZFQ7tg)~v{b6{p6KJ;K$bU5Y>88!Q=dVE*#EOUb?j*GX z5uwo(%r#^v_1WxytKnr%mWK!B?S1!jfojq<(dF*K(jqI>|J6JrI0ugX4H1`@Bekw$ z?boJ|M?Yr7!(^bh|7a64_%?k(K!H@|`waDGmjce`r8G$audy{)u%f%3gEQ<5$$5Yf zW8@+<)dQ)eALn{+?PYGto1et#+GHl^^xPg49^YSwC1Bf=E_+cII`;joltOjzvsA>e z55C@N>(o}MpgZ@<3PB^_a{Ff)>gtyFUNV~`%K5dPY>`kbov>zE(44i1XL@dd#2&Q! zgCt`F5HkHl)_^8pSJKAE9I55!6B1})KuS4YOKRXMG0SCdeBtRQ`aDBSgIHQ~)jdEH zF;M%Rs)2)=a05w)F2XozCYMx$sR7#q=~qeAWI{-r2y4mt#Ai0WLE|GN2Wr>Q_CCtd z#o9V|vhzUne_Vd7@!UyfS%J$N!d{ognZsCWR8SfPbWLWBd0IYRuANe&P9#0(Oad=` z{t7X*6PLB6ITQYbqhb}crl5?5oc7si1aPXxw_zjwXaW}GIp9Zay3HO_ny zTFp)`pFm6PhGE5OwcPnViASY&$V48C*Iw>4sz9gPTTWW5>tiJ?c7ocsAY5|pS@E8f zP#417BV}Ws7h^a~vCarjJt{HfqS)w6&xuQ*PK6RF{XCUYbXaxRiN#EQ5L>EF`B9ze z9tF8Ft^!R6k_1b^H>3rwj{(p)B)guFWDGTGljza(?N3O>9x)*zl8;1Q^{z;Y-ff?4%M5w2q1v)7<7-1m1@o1lAua*J~H2@qQC++b4MRN0la~@%o~oZHg%w`pfUW z(0|txD09$1{TWshO1~E(S=I?l#s0gfUKd#hqF&MIZz#1}O;N)B`9oUxx$JV>*=hQt zOl?=5X9HFAqE>;!*)Oil`Xn?_QME}-K4^`I?3(tEPe|R*N8)i27$i80d+;{DbrS*o zYFCe2$SPZ?!OPF$e?R|vv26W6qRu+3$v1BMl8%NkQfeclTNo+L7^pB2VIa~e4N{`S z=ILF;S54jM3huO4Bl(M=RKb14>T=Da$%8?dW11$BMOz{VPeQ7ss2K&&EV6lCxO|+#)`%kS5 zj4u$#`GFW~58kbghTKXZtIK}$XZX>*zx7#bAU^P37|DAR&MR*7hR^2rAawalz~7RSynGE_pRD);lz9op!ZYa@)>06{@LKQRQsDYU&k<4a!KIri+dkr&Fal( z>5GOeoc5it4o8ffPVHWX!?2Ps&9P4fAh8U2LjNe3gAxH-D_>g`#9|QzX5NaeF|~hVCCIMVflc^@<_c^f>X3HOl1C(;dZvN)ZIomjwOQ(7`mdi;13yj0=rQkjh}C?x>Mad&XS6Qu8B&SOS?PJLLXFo>Nh=GV zQAveSZ-q%mUXy0dL^^%QU=e@DTDiVoi9PFu=_4G2lHLmkq>y=W5#FbD{$$kWlu|`g zBRDR&lW-##XPNb7CK*`5hJ+gqAg1^OOqwZ_kz|6elAdctfRvmNT8@rPxI*A)%b3c( zFPfbDJUio-RvL;Ts4Z;}3vVlJtr+j5Vh+}RNAhR?S>bkL!!Yc1HY_?+3q?pwdc3@U zNf~GNXaBmg-NZ!4auSrzAy%iHiMp*Vh-5O@ZWC3^52Y9EZ)QUJ=C1eXRLHOwrLFjO zdvAPPjqVMKN+V6yHnlJEmY0i{@P<0t1HiB)WX?jP) zyV9+3qdcqHZdjB*-oyt*!Z7b9-=n>Q^A)K|SI~5gF`uoO062NP503nP&$5O*1tLLM zd|R3XR`s~Q79!DXkzfQ)$f{=@3VH7)qaXRSQCjU+FqQYtlV5*1&6F>*L72VER=+JT zj%`hG9DCQ~RQebzQkh};H545n(|xE7%b)LXX)oJy!wAT1#wfH zit`JV*QN7cqSH%dkCs!~B(L{T{kx)FfA^5~EhZl85&nC3XElHLjr=7g3;xZN!d=9K z#4U;ycC&_QFHF%-^PQP=y}G=JZYH6!?qQBpV`{+%!f[W*FdsOC~#;kMUfTbMme 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 z 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