#!/usr/bin/perl korjaa tama rivi vastaamaan oman koneen perl hakemistoa jos ei ole asennettu asenna perl
On perl siellä. Koitin ajaa skriptin bash-komennolla, joka antoi nuo virheet. Ajamalla ilman bash-komentoa ei tuottanut virheilmoituksia, muttei myöskään lämpötilaa NetHomeen. Onko tuossa yhdellä rivillä pieni fiba? Koodi: print $sock "event,UPM_Message,Direction,In,UPM.DeviceCode,4,U PM.HouseCode,1,UPM.Primary,$ret,UPM.Secondary,122, UPM.SequenceNumber,0\n" or die "Sent failed : $!"; Yhdessä kohtaa lukee "U PM.HouseCode" (välilyönti väärässä paikassa?) ja toisessa kohtaa: ", UPM.SequenceNumber" on välilyönti pilkun jälkeen. Ja onko IP-osoitteella väliä? Mikä IP-osoite pitää laittaa? Koodi: PeerAddr => '192.168.1.250', Olen "korjannut" nuo välilyönnit, sekä kokeillut eri IP-osoitteita, mutta ei silti onnistu. EDIT: DS1820Temp ei myöskään kirjoita lokia, vaikka lokitiedosto on luotu, oikeudet annettu ja polku määritelty DS1820Temp:iin.
#!/usr/bin/perl use strict; use warnings; use IO::Socket; # my $sensordata = `cat /sys/bus/w1/devices/$device/w1_slave 2>&1`; # print "Read: $sensordata"; my $sensordata = `cat /sys/class/thermal/thermal_zone0/temp 2>&1`; #fix for negative temps from http://habrahabr.ru/post/163575/ $sensordata =~ /t=(\D*\d+)/i; #$sensor_temp =~ /t=(\d+)/i; $sensordata = $sensordata / 1000 ; my $ret = $sensordata*1000; #sent tcp packet nethome my $sock = IO::Socket::INET->new( Proto => 'udp', PeerPort => 8005, PeerAddr => '192.168.1.250', ) or die "Could not create socket: $!\n"; $ret = sprintf("%.0f", $ret); print $sock "event,UPM_Message,Direction,In,UPM.DeviceCode,4,UPM.HouseCode,1,UPM.Primary,$ret,UPM.Secondary,122,UPM.SequenceNumber,0\n" or die "Sent failed : $!"; tulikohan nyt oikein taisin copy paste jotenkin oudosti ja tee sitten vielä udp command port 8005 nethomeen ja ipeeksi raspberry ip josko niillä lähtis toimii kannattaa muuten katsoa netistä vinkkiä miten tuon raspin saa kiinteeseen ipeeseen niin pysyy aina samana ip osote. bashina ei tuota voi ajaa kun sock on ainakin perl käskyjä
Nyt kun vielä kirjoittaisi lokia. Odotan tuohon klo 13:30 asti ja katson tuleeko lokiin mitään. EDIT: Eipä kirjoita, ei. Olen tuon polun antanut kuten muillekin lämpömittareille, sekä luonut lokitiedoston ja antanut kaikki mahdolliset oikeudet. Muut lämpömittarit kirjoittavat kiltisti lokia, mutta tämä ei. Polku on "/home/pi/NetHome/logs/t_pi.log" (ilman lainausmerkkejä) ja tuo "t_pi.log" on polun päässä olemassa ja sille on oikeudet 777. Mutta se pysyy tyhjänä.
höh no eipä kirjota nyt vasta itekki katoin ja nethomen logissa mulla on virhettä Failed to open log file: ../logs/pitemp.log Error:java.io.FileNotFoundException: ../logs/pitemp.log (Permission denied) nyt ite kokeilin chmod 777 tuo log file josko siitä tokenis
Lakkasivat muutkin mittarit kirjoittamasta lokia. E: No nyt lähtivät kirjoittamaan. Piti uudelleen antaa koko NetHome-kansiolle (alikansioineen) oikeudet 777. En tiedä riittäisikö pelkän lokikansion oikeuksien muuttaminen, mutta muutin kuitenkin koko roskan.
mulla lähti kyl nyt logi pelittää vaati vissiin sen chmod 777 sille logi fileelle kannattaa varmaan buuttaa vaikka nethome jos se logger ois jääny jumiin.
Buuttasinkin koko Raspberryn, mutta loki lähti rullaamaan vasta koko kansion oikeuksien muuttamisen jälkeen. Oikeudet olivat jo 777, mutta kun annoin oikeudet 777 uudelleen, lähti loki vihdoin rullaamaan.
Omistan Tellstick Netin ja meinasin, että onko sitä mahdollista käyttää raspberryn kanssa? Duo malliinhan löytynee ilmeisesti ajurit mutta löytyykö Net versioon koska sehän ottaa virran verkkovirrasta? Saa toki koneeseekin kiinni mini-usb:llä.
aaah joo sekotin sen siihen toiseen mut äkkiä katellen siin ei usb serial port moodia ole. Tosin jos siihen source koodi on avointa niin ehkä joku vois siihen custom firmeiksen tehdä.
Joku kyseli PM:llä tuosta auton lämmityksestä NetHomessa. Vastailen tässä ketjussa, niin kaikki hyötyvät. Eli mulla on käytössä kolme eri lämmitysaikaa, riippuen ulkolämpötilasta. +3...-5°C autoa lämmitetään 45 minuuttia. -5...-12°C autoa lämmitetään 1h. Alle -12°C autoa lämmitetään 2h. Yli +3°C autoa ei lämmitetä lainkaan. Systeemissä on monta osaa, mutta keskeisimmät ovat ValueTriggerit: Mä olen ne nimennyt CarTrigger A, B ja C. Ruutukaappaukset alla: https://dl.dropboxusercontent.com/u/1924891/NetHome/Screen Shot 2014-02-14 at 19.02.21.jpg https://dl.dropboxusercontent.com/u/1924891/NetHome/Screen Shot 2014-02-14 at 19.02.40.jpg https://dl.dropboxusercontent.com/u/1924891/NetHome/Screen Shot 2014-02-14 at 19.03.01.jpg ("°C Outside" on ulkolämpömittarin nimi) A asettaa ajastimen* kun lämpötila on joko yli tai ali +3°C. (*CarTimer, joka ohjaa suoraan autopistoketta "CarSwitch") B asettaa ajastimen kun lämpötila on joko yli tai ali -5°C. C asettaa ajastimen kun lämpötila on joko yli tai ali -12°C. Noihin CarTriggereihin mä en koske, vaan CarTriggerin aktivoi/deaktivoi erillinen WakeUpScene, joka ensi alkuun asettaa ajastimen ajaksi yhden tunnin (+ puoli tuntia extraa). Tämän jälkeen automatiikka vaihtaa aikaa mikäli lämpötila muuttuu, eli jos lämpötila kulkee tietyn asetetun rajan yli. https://dl.dropboxusercontent.com/u/1924891/NetHome/Screen Shot 2014-02-14 at 19.15.11.jpg Tässä tapauksessa herätysaika on 06:00 ja lähtöaika 07:00 (jolloin siis auton pitää olla lämmin). Lähtöajan olen aina laittanut yhtä tuntia herätyksen jälkeen. Jokainen tehköön omalla tavallaan. Eri herätysajoille on erilliset WakeUpScenet ja CarTriggerit. Itselläni on tehtynä 5 eri herätysaikaa (06:00, 06:30, 07:00, 07:30 ja 08:00), joten WakeUpScenejä on 5 kpl ja CarTriggereita (A, B ja C) on 15 kpl. NetHomen kotisivulla on 5 nappia eri kellonajoille, sekä vielä erillinen OFF-nappi, joka disabloi kaikki ajastimet (asettaa ajaksi pelkän tyhjän välilyönnin) ja sammuttaa kaukokytkimet. WakeUpScene aktivoi myös kahvinkeittimen 10 min ennen herätystä, sekä sarastusvalon alkamaan puoli tuntia ennen herätystä. Sarastusvalo voimistaa makkarin valoa hitaasti puolen tunnin ajan, kunnes loistaa täydellä teholla herätyksen aikaan. Lopulta valo sammuu kokonaan lähdön aikaan. Tarkoitus on liittää systeemin vielä herätysradio. Valitettavasti systeemi ei (vielä) salli herätysajan syöttämisen suoraan numeroina, vaan pitää tehdä monta eri Sceneä eri kellonajoille. NetHomen kehittäjä tosin vihjasi että hän miettii asiaa, mutta mainitsi samaan hengenvetoon että hän on kiireinen mies. Vois noi triggerit/systeemit kai tehdä elegantimminkin, mutta tähän hätään en ole jaksanut miettiä päätäni puhki.
pitkästä aikaa perehtyä taas nethomen säätöön. Nasty mitä noi K ja M on tossa DS1820 pluginissa? sain lähetettyä serveristä raspiin lämpötilan tolla perl skripitilläsi mutta se pyöristää 0.6875 -> 0.0 toki se nyt on riittävä tarkkuus kaikkeen mutta kyllä se puolen asteen tarkkuus olisi kiva saada vaikkei ole pääasiallinen lämpötilan tallennuspaikka
Tota siinä ds1820 plugarissa m on jakaja joka siis jakaa 1000:lla arvon ja k ei ole käytössä. laitan tähän alas tuon ds1820 sourcen tulevaa tarvetta varten. import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Logger; import nu.nethome.home.item.HomeItem; import nu.nethome.home.item.HomeItemAdapter; import nu.nethome.home.item.LoggerComponent; import nu.nethome.home.item.ValueItem; import nu.nethome.home.system.Event; import nu.nethome.home.system.HomeService; import nu.nethome.util.plugin.Plugin; @Plugin public class DS1820Temp extends HomeItemAdapter implements HomeItem, ValueItem { private static final String MODEL = "<?xml version = \"1.0\"?> \n<HomeItem Class=\"DS1820Temp\" Category=\"Thermometers\" > <Attribute Name=\"Temperature\" \tType=\"String\" Get=\"getValue\" Default=\"true\" /> <Attribute Name=\"BatteryLevel\" \tType=\"String\" Get=\"getBatteryLevel\" /> <Attribute Name=\"TimeSinceUpdate\" \tType=\"String\" Get=\"getTimeSinceUpdate\" /> <Attribute Name=\"HouseCode\" \tType=\"String\" Get=\"getHouseCode\" \tSet=\"setHouseCode\" /> <Attribute Name=\"DeviceCode\" Type=\"String\" Get=\"getDeviceCode\" \tSet=\"setDeviceCode\" /> <Attribute Name=\"LogFile\" Type=\"String\" Get=\"getLogFile\" \tSet=\"setLogFile\" /> <Attribute Name=\"LastUpdate\" Type=\"String\" Get=\"getLastUpdate\" /> <Attribute Name=\"K\" Type=\"String\" Get=\"getK\" \tSet=\"setK\" /> <Attribute Name=\"M\" Type=\"String\" Get=\"getM\" \tSet=\"setM\" /></HomeItem> "; private static Logger logger = Logger.getLogger(DS1820Temp.class.getName()); private LoggerComponent tempLoggerComponent = new LoggerComponent(this); private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss yyyy.MM.dd "); private double temperature = 0.0D; private double constantK = 0.0625D; private double constantM = 1000.0D; private String itemHouseCode = "2"; private String itemDeviceCode = "1"; private Date latestUpdateOrCreation = new Date(); private boolean hasBeenUpdated = false; private boolean batteryIsLow = false; public boolean receiveEvent(Event paramEvent) { if ((paramEvent.getAttribute("Type").equals("UPM_Message")) && (paramEvent.getAttribute("UPM.HouseCode").equals(this.itemHouseCode)) && (paramEvent.getAttribute("UPM.DeviceCode").equals(this.itemDeviceCode))) { this.temperature = (paramEvent.getAttributeInt("UPM.Primary") / this.constantM); boolean bool = paramEvent.getAttributeInt("UPM.LowBattery") != 0; if ((!this.batteryIsLow) && (bool)) { logger.warning("Low battery for " + this.name); } this.batteryIsLow = bool; logger.finer("Temperature update: " + this.temperature + " degrees"); this.latestUpdateOrCreation = new Date(); this.hasBeenUpdated = true; return true; } return false; } public String getModel() { return "<?xml version = \"1.0\"?> \n<HomeItem Class=\"DS1820Temp\" Category=\"Thermometers\" > <Attribute Name=\"Temperature\" \tType=\"String\" Get=\"getValue\" Default=\"true\" /> <Attribute Name=\"BatteryLevel\" \tType=\"String\" Get=\"getBatteryLevel\" /> <Attribute Name=\"TimeSinceUpdate\" \tType=\"String\" Get=\"getTimeSinceUpdate\" /> <Attribute Name=\"HouseCode\" \tType=\"String\" Get=\"getHouseCode\" \tSet=\"setHouseCode\" /> <Attribute Name=\"DeviceCode\" Type=\"String\" Get=\"getDeviceCode\" \tSet=\"setDeviceCode\" /> <Attribute Name=\"LogFile\" Type=\"String\" Get=\"getLogFile\" \tSet=\"setLogFile\" /> <Attribute Name=\"LastUpdate\" Type=\"String\" Get=\"getLastUpdate\" /> <Attribute Name=\"K\" Type=\"String\" Get=\"getK\" \tSet=\"setK\" /> <Attribute Name=\"M\" Type=\"String\" Get=\"getM\" \tSet=\"setM\" /></HomeItem> "; } public void activate(HomeService paramHomeService) { super.activate(paramHomeService); this.tempLoggerComponent.activate(); } public void stop() { this.tempLoggerComponent.stop(); } public String getValue() { return this.hasBeenUpdated ? String.format("%.1f", new Object[] { Double.valueOf(this.temperature) }) : ""; } public String getK() { return Double.toString(this.constantK); } public void setK(String paramString) { this.constantK = Double.parseDouble(paramString); } public String getM() { return Double.toString(this.constantM); } public void setM(String paramString) { this.constantM = Double.parseDouble(paramString); } public String getDeviceCode() { return this.itemDeviceCode; } public void setDeviceCode(String paramString) { this.itemDeviceCode = paramString; } public String getHouseCode() { return this.itemHouseCode; } public void setHouseCode(String paramString) { this.itemHouseCode = paramString; } public String getLastUpdate() { return this.hasBeenUpdated ? dateFormatter.format(this.latestUpdateOrCreation) : ""; } public String getBatteryLevel() { return this.batteryIsLow ? "10" : "100"; } public String getLogFile() { return this.tempLoggerComponent.getFileName(); } public void setLogFile(String paramString) { this.tempLoggerComponent.setFileName(paramString); } public String getTimeSinceUpdate() { return Long.toString((new Date().getTime() - this.latestUpdateOrCreation.getTime()) / 1000L); } }
saattaa siis olla että nethome vielä pyöristää tuon sisään tulevan datan. en ole varma itse en näin tarkkaan ole tainnut koskaan Katella.
Normaali kuolevainen (ml. minä ite) ei ymmärrä tuosta yhtään mitään In the meanwhile, Stefan on vääntänyt NetHomeen näppärän NexaLCAdvancedRemapButton -itemin. Sillä saa Nexa seinäkatkaisijalle monta toimintoa, riippuen siitä onko pitkä vai lyhyt painallus. Mulla on esimerkiksi keittiössä ihan tavallinen yksiosainen Nexa-katkaisija, joka ohjaa kahvinkeittimen pistoketta. Tavalliset (lyhyet) painallukset ylös ja alas kytkevät kahvisähkön päälle ja pois. Pitkät painallukset aktivoivat 20 ja 50 minuutin viiveet, jonka jälkeen virta kytkeytyy päälle. Näppärää esimerkiksi jos vieraat saapuvat puolen tunnin tai tunnin kuluttua. Kahvisähkö kytkeytyy myös automaattisesti aamulla 10 minuuttia ennen herätystä. Makkarissa taas on kaksiosainen katkaisija, jonka vasen puolisko ohjaa kattolampun himmennintä. Lyhyt painallus ylös/alas: Päälle 70% / Pois. Pitkä painallus ylös/alas: Päälle 100% / Päälle 20%. Meillä tuo 70% on normaalivalaistus ja 100% on nk. siivousvalo. Katkaisijan oikea puolisko kytkee eri herätysaikoja päälle ja pois. Kattolamppu vilkkuu kuittaukseksi painalluksen jälkeen eri tavoin, riippuen painalluksen kestosta. Kattolamppu toimii aamulla sarastuvalona, aktivoituen puoli tuntia ennen herätystä. Kaikki käskyt menevät ns. "fly-by-wire", eli yhtään käskyä ei mene suoraan katkaisijasta himmentimelle, vaan kaikki kulkee Raspberryn kautta. Sama koskee kahvisähköä.
huomasin myös tuon NexaLCAdvanced.RemapButton, aika kätevä. pitäisi keksiä vaan käyttöä sille jotain pielessä tuossa lämpötilan lähetyksessä ei se pyöristyksestä ole koska kaikki lukemat on nollia. se perl skripti siis pyörii debian serverissä ja lukee lämpötilat näin: my $sensordata = `cat /mnt/1wire/10.BE6A01020800/temperature 2>&1`; raspin logiin tulee kuitenkin,jostain syystä vain vartin välein vaikka perli pyörii 5min välein crontabilla ajastettuna. 2014.03.04 18:45:00;0.0 2014.03.04 19:00:00;0.0 2014.03.04 19:15:00;0.0 2014.03.04 19:30:00;0.0 2014.03.04 19:45:00;0.0